Java中使用Timer和TimerTask實現多線程


      Timer是一種線程設施,用於安排以后在后台線程中執行的任務。可安排任務執行一次,或者定期重復執行,可以看成一個定時器,可以調度TimerTask。TimerTask是一個抽象類,實現了Runnable接口,所以具備了多線程的能力。

測試代碼:

import java.util.TimerTask;
  
public class OneTask extends TimerTask{
  
     private int id;
     public OneTask( int id){
         this .id = id;
     }
      
     @Override
     public void run() {
         System.out.println( "線程" + id + ":  正在 執行。。" ); 
         //System.gc();
     }   
}

然后主程序代碼為:

 

import java.util.Date;
import java.util.Timer;
   
public class Test1 {
       
     public static void main(String[] args) {
         Timer timer = new Timer(); 
  
         timer.schedule( new OneTask( 1 ), 5000 ); // 5秒后啟動任務
          
         OneTask secondTask= new OneTask( 2 );
         timer.schedule(secondTask, 1000 , 3000 ); // 1秒后啟動任務,以后每隔3秒執行一次線程
          
         Date date = new Date();
         timer.schedule( new OneTask( 3 ), new Date(date.getTime()+ 1000 )); //以date為參數,指定某個時間點執行線程
          
//      timer.cancel();
//      secondTask.cancel();
         System.out.println( "end in main thread..." );
     }
}



Timer里面有4個schedule重載函數。而且還有兩個scheduleAtFixedRate:

void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任務在指定的時間開始進行重復的固定速率執行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任務在指定的延遲后開始進行重復的固定速率執行。

使用scheduleAtFixedRate的話, Timer會盡量的讓任務在一個固定的頻率下運行。例如:在上面的例子中,讓secondTask在1秒鍾后,每3秒鍾執行一次,但是因為java不是實時的,所以,我們在上個程序中表達的原義並不能夠嚴格執行,例如有時可能資源調度緊張4秒以后才執行下一次,有時候又3.5秒執行。如果我們調用的是scheduleAtFixedRate,那么Timer會盡量讓你的secondTask執行的頻率保持在3秒一次。運行上面的程序,假設使用的是scheduleAtFixedRate,那么下面的場景就是可能的:1秒鍾后,secondTask執行一次,因為系統繁忙,之后的3.5秒后secondTask才得以執行第二次,然后Timer記下了這個延遲,並嘗試在下一個任務的時候彌補這個延遲,那么2.5秒后,secondTask 將執行的三次。“以固定的頻率而不是固定的延遲時間去執行一個任務”就是這個意思。

Timer終止的問題:

默認情況下,只要一個程序的timer線程在運行,那么這個程序就會保持運行。可以通過以下3種方法終止一個timer線程:
(1)調用timer的cancle方法。你可以從程序的任何地方調用此方法,甚至在一個timer task的run方法里;
(2)讓timer線程成為一個daemon線程(可以在創建timer時使用new Timer(true)達到這個目地),這樣當程序只有daemon線程的時候,它就會自動終止運行;
(3)調用System.exit方法,使整個程序(所有線程)終止。

TimerTask也有cancel方法。

上面所說的“只要一個程序的timer線程在運行,那么這個程序就會保持運行”。那么反過來,如果Timer里的所有TimerTask都執行完了,整個程序會退出嗎,經測試答案是否定的,例如上面的測試代碼,如果只加第一個TimerTask在Timer中執行:

timer.schedule(new OneTask(1), 5000);// 5秒后啟動任務
那么5秒以后,其實整個程序還是沒有退出,Timer會等待垃圾回收的時候被回收掉然后程序會得以退出,但是多長時間呢?

在TimerTask的run函數執行完以后加上System.gc();就可以了。

 

原文摘自  http://www.bdqn.cn/news/201305/9303.shtml


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM