Java線程(五):Timer和TimerTask

Timer和TimerTask能夠作爲實現線程的第三種方式,前兩中方式分別是繼承自Thread類和實現Runnable接口。 java

        Timer是一種線程設施,用於安排之後在後臺線程中執行的任務。可安排任務執行一次,或者按期重複執行,能夠當作一個定時器,能夠調度TimerTask。TimerTask是一個抽象類,實現了Runnable接口,因此具有了多線程的能力。 多線程

        一個Timer能夠調度任意多個TimerTask,它會將TimerTask存儲在一個隊列中,順序調度,若是想兩個TimerTask併發執行,則須要建立兩個Timer。下面來看一個簡單的例子:         併發

[java]   view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. import java.util.Timer;  
  2. import java.util.TimerTask;  
  3. public class TimerTest {  
  4.     static class MyTimerTask1 extends TimerTask {  
  5.         public void run() {  
  6.             System.out.println("爆炸!!!");  
  7.         }  
  8.     }     
  9.     public static void main(String[] args) {  
  10.         Timer timer = new Timer();  
  11.         timer.schedule(new MyTimerTask1(), 2000);// 兩秒後啓動任務  
  12.     }  
  13. }  
        schedule是Timer調度任務的方法,Timer重構了四個schedule方法,具體能夠查看JDK API。

        看一個稍複雜的例子,假設有這樣一種需求,實現一個連環炸彈,2秒後爆炸一次,3秒後爆炸一次,如此循環下去,這就須要建立兩個任務,互相調度,代碼以下: app

[java]   view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. import java.util.Date;  
  2. import java.util.Timer;  
  3. import java.util.TimerTask;  
  4. public class TimerTest {  
  5.     static class MyTimerTask1 extends TimerTask {  
  6.         public void run() {  
  7.             System.out.println("爆炸!!!");  
  8.             new Timer().schedule(new MyTimerTask2(), 2000);  
  9.         }  
  10.     }  
  11.     static class MyTimerTask2 extends TimerTask {  
  12.         public void run() {  
  13.             System.out.println("爆炸!!!");  
  14.             new Timer().schedule(new MyTimerTask1(), 3000);  
  15.         }  
  16.     }  
  17.     public static void main(String[] args) {  
  18.         Timer timer = new Timer();  
  19.         timer.schedule(new MyTimerTask2(), 2000);  
  20.         while(true) {  
  21.             System.out.println(new Date().getSeconds());  
  22.             try {  
  23.                 Thread.sleep(1000);  
  24.             } catch (InterruptedException e) {  
  25.                 // TODO Auto-generated catch block  
  26.                 e.printStackTrace();  
  27.             }  
  28.         }  
  29.     }  
  30. }  

        自JDK5以後,能夠用ScheduledThreadPoolExecutor來替代Timer。 spa

相關文章
相關標籤/搜索