ScheduledThreadPoolExecutor是ThreadPoolExecutor的子類;html
JDK api裏是這麼說的:java
ThreadPoolExecutor
,它可另行安排在給定的延遲後運行命令,或者按期執行命令。須要多個輔助線程時,或者要求 ThreadPoolExecutor
具備額外的靈活性或功能時,此類要優於 Timer
。api
一旦啓用已延遲的任務就執行它,可是有關什麼時候啓用,啓用後什麼時候執行則沒有任何實時保證。按照提交的先進先出 (FIFO) 順序來啓用那些被安排在同一執行時間的任務。app
---------------ide
平時咱們在執行一個定時任務時,會採用Time,和TimeTask來組合處理;測試
可是Timer和TimerTask存在一些缺陷:spa
1:Timer只建立了一個線程。當你的任務執行的時間超過設置的延時時間將會產生一些問題。.net
2:Timer建立的線程沒有處理異常,所以一旦拋出非受檢異常,該線程會當即終止。線程
JDK 5.0之後推薦使用ScheduledThreadPoolExecutor。該類屬於Executor Framework,它除了能處理異常外,還能夠建立多個線程解決上面的問題。code
如下爲測試代碼:
[java] view plain copy
- public class TaskTest {
- static ScheduledThreadPoolExecutor stpe = null;
- static int index;
- /**
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- // TODO code application logic here
- //構造一個ScheduledThreadPoolExecutor對象,而且設置它的容量爲5個
- stpe = new ScheduledThreadPoolExecutor(5);
- MyTask task = new MyTask();
- //隔2秒後開始執行任務,而且在上一次任務開始後隔一秒再執行一次;
- // stpe.scheduleWithFixedDelay(task, 2, 1, TimeUnit.SECONDS);
- //隔6秒後執行一次,但只會執行一次。
- stpe.schedule(task, 6, TimeUnit.SECONDS);
- }
-
- private static String getTimes() {
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
- Date date = new Date();
- date.setTime(System.currentTimeMillis());
- return format.format(date);
- }
-
- private static class MyTask implements Runnable {
-
- @Override
- public void run() {
- index++;
- System.out.println("2= " + getTimes()+" " +index);
- if(index >=10){
- stpe.shutdown();
- if(stpe.isShutdown()){
- System.out.println("中止了????");
- }
- }
- }
- }
- }