ScheduledThreadPoolExecutor是ThreadPoolExecutor的子類;html
JDK api裏是這麼說的:java
ThreadPoolExecutor
,它可另行安排在給定的延遲後運行命令,或者按期執行命令。須要多個輔助線程時,或者要求 ThreadPoolExecutor
具備額外的靈活性或功能時,此類要優於 Timer
。api
一旦啓用已延遲的任務就執行它,可是有關什麼時候啓用,啓用後什麼時候執行則沒有任何實時保證。按照提交的先進先出 (FIFO) 順序來啓用那些被安排在同一執行時間的任務。ide
---------------spa
平時咱們在執行一個定時任務時,會採用Time,和TimeTask來組合處理;.net
可是Timer和TimerTask存在一些缺陷:線程
1:Timer只建立了一個線程。當你的任務執行的時間超過設置的延時時間將會產生一些問題。code
2:Timer建立的線程沒有處理異常,所以一旦拋出非受檢異常,該線程會當即終止。orm
JDK 5.0之後推薦使用ScheduledThreadPoolExecutor。該類屬於Executor Framework,它除了能處理異常外,還能夠建立多個線程解決上面的問題htm
1 package timer; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 import java.util.concurrent.ScheduledThreadPoolExecutor; 6 import java.util.concurrent.TimeUnit; 7 8 public class Test 9 { 10 static ScheduledThreadPoolExecutor stp = null; 11 static int index; 12 13 private static String getTimes() { 14 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E"); 15 Date date = new Date(); 16 date.setTime(System.currentTimeMillis()); 17 return format.format(date); 18 } 19 20 21 private static class MyTask implements Runnable { 22 23 @Override 24 public void run() { 25 index++; 26 System.out.println("2= " + getTimes()+" " +index); 27 // if(index >=10){ 28 // stp.shutdown(); 29 // if(stp.isShutdown()){ 30 // System.out.println("中止了????"); 31 // } 32 // } 33 } 34 } 35 public static void main(String[] args) 36 { 37 stp = new ScheduledThreadPoolExecutor(5); 38 MyTask mytask = new MyTask(); 39 //mytask爲線程,2是首次執行的延遲時間,最後一個參數爲時間單位 40 // stp.schedule(mytask, 2, TimeUnit.SECONDS); 41 // 首次執行延遲2秒,以後的執行週期是1秒 42 // stp.scheduleAtFixedRate(mytask, 2, 1,TimeUnit.SECONDS ); 43 //首次執行延遲2秒,以後從上一次任務結束到下一次任務開始時1秒 44 stp.scheduleWithFixedDelay(mytask, 2, 1, TimeUnit.SECONDS); 45 46 } 47 48 }