java多線程學習-java.util.concurrent詳解(三)ScheduledThreadPoolExecutor
6. ScheduledThreadPoolExecutor 我們先來學習一下JDK1.5 API中關于這個類的詳細介紹: "可另行安排在給定的延遲后運行命令,或者定期執行命令。需要多個輔助線程時,或者要求 ThreadPoolExecutor 具有額外的靈活性或功能時,此類要優于 Timer。 一旦啟用已延遲的任務就執行它,但是有關何時啟用,啟用后何時執行則沒有任何實時保證。按照提交的先進先出 (FIFO) 順序來啟用那些被安排在同一執行時間的任務。 雖然此類繼承自 ThreadPoolExecutor,但是幾個繼承的調整方法對此類并無作用。特別是,因為它作為一個使用 corePoolSize 線程和一個無界隊列的固定大小的池,所以調整 maximumPoolSize 沒有什么效果。" 在JDK1.5之前,我們關于定時/周期操作都是通過Timer來實現的。但是Timer有以下幾種危險[JCip] a. Timer是基于絕對時間的。容易受系統時鐘的影響。 b. Timer只新建了一個線程來執行所有的TimeTask。所有TimeTask可能會相關影響 c. Timer不會捕獲TimerTask的異常,只是簡單地停止。這樣勢必會影響其他TimeTask的執行。 如果你是使用JDK1.5以上版本,建議用ScheduledThreadPoolExecutor代替Timer。它基本上解決了上述問題。它采用相對時間,用線程池來執行TimerTask,會出來TimerTask異常。 下面通過一個簡單的實例來闡述ScheduledThreadPoolExecutor的使用。 我們定期讓定時器拋異常 我們定期從控制臺打印系統時間 代碼如下(參考了網上的一些代碼,在此表示感謝)
import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class TestScheduledThreadPoolExecutor { public static void main(String[] args) { ScheduledThreadPoolExecutor exec=new ScheduledThreadPoolExecutor(1); exec.scheduleAtFixedRate(new Runnable(){//每隔一段時間就觸發異常 @Override public void run() { throw new RuntimeException(); }}, 1000, 5000, TimeUnit.MILLISECONDS); exec.scheduleAtFixedRate(new Runnable(){//每隔一段時間打印系統時間,證明兩者是互不影響的 @Override public void run() { System.out.PRintln(System.nanoTime()); }}, 1000, 2000, TimeUnit.MILLISECONDS); } } 總結:是時候把你的定時器換成 ScheduledThreadPoolExecutor了
|
新聞熱點
疑難解答