Java 多線程之 ScheduledThreadPoolExecutor 定時任務

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的使用。 
   
    我們定期讓定時器拋異常 
    我們定期從控制檯打印系統時間
 

代碼如下(參考了網上的一些代碼,在此表示感謝)

Java代碼  收藏代碼
  1. import  java.util.concurrent.ScheduledThreadPoolExecutor;  
  2. import  java.util.concurrent.TimeUnit;  
  3.   
  4.   
  5. public   class  TestScheduledThreadPoolExecutor {  
  6.       
  7.     public   static   void  main(String[] args) {  
  8.         ScheduledThreadPoolExecutor exec=new  ScheduledThreadPoolExecutor( 1 );  
  9.           
  10.         exec.scheduleAtFixedRate(new  Runnable(){ //每隔一段時間就觸發異常   
  11.             @Override   
  12.             public   void  run() {  
  13.                 throw   new  RuntimeException();  
  14.             }}, 1000 ,  5000 , TimeUnit.MILLISECONDS);  
  15.           
  16.         exec.scheduleAtFixedRate(new  Runnable(){ //每隔一段時間打印系統時間,證明兩者是互不影響的   
  17.             @Override   
  18.             public   void  run() {  
  19.                 System.out.println(System.nanoTime());  
  20.             }}, 1000 ,  2000 , TimeUnit.MILLISECONDS);  
  21.     }  
  22.   
  23. }  



總結:是時候把你的定時器換成 ScheduledThreadPoolExecutor了


地址:http://shuaigg-babysky.iteye.com/blog/1757195

發佈了62 篇原創文章 · 獲贊 138 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章