# Java線程(五):Timer和TimerTask
Timer和TimerTask可以做為實現線程的第三種方式,前兩中方式分別是繼承自Thread類和實現Runnable接口。
Timer是一種線程設施,用于安排以后在后臺線程中執行的任務。可安排任務執行一次,或者定期重復執行,可以看成一個定時器,可以調度TimerTask。TimerTask是一個抽象類,實現了Runnable接口,所以具備了多線程的能力。
一個Timer可以調度任意多個TimerTask,它會將TimerTask存儲在一個隊列中,順序調度,如果想兩個TimerTask并發執行,則需要創建兩個Timer。下面來看一個簡單的例子: ? ? ? ?
~~~
import?java.util.Timer;??
import?java.util.TimerTask;??
public?class?TimerTest?{??
????static?class?MyTimerTask1?extends?TimerTask?{??
????????public?void?run()?{??
????????????System.out.println("爆炸!!!");??
????????}??
????}?????
????public?static?void?main(String[]?args)?{??
????????Timer?timer?=?new?Timer();??
????????timer.schedule(new?MyTimerTask1(),?2000);//?兩秒后啟動任務??
????}??
}??
~~~
schedule是Timer調度任務的方法,Timer重構了四個schedule方法,具體可以查看JDK API。
看一個稍復雜的例子,假設有這樣一種需求,實現一個連環炸彈,2秒后爆炸一次,3秒后爆炸一次,如此循環下去,這就需要創建兩個任務,互相調度,代碼如下:
~~~
import?java.util.Date;??
import?java.util.Timer;??
import?java.util.TimerTask;??
public?class?TimerTest?{??
????static?class?MyTimerTask1?extends?TimerTask?{??
????????public?void?run()?{??
????????????System.out.println("爆炸!!!");??
????????????new?Timer().schedule(new?MyTimerTask2(),?2000);??
????????}??
????}??
????static?class?MyTimerTask2?extends?TimerTask?{??
????????public?void?run()?{??
????????????System.out.println("爆炸!!!");??
????????????new?Timer().schedule(new?MyTimerTask1(),?3000);??
????????}??
????}??
????public?static?void?main(String[]?args)?{??
????????Timer?timer?=?new?Timer();??
????????timer.schedule(new?MyTimerTask2(),?2000);??
????????while(true)?{??
????????????System.out.println(new?Date().getSeconds());??
????????????try?{??
????????????????Thread.sleep(1000);??
????????????}?catch?(InterruptedException?e)?{??
????????????????//?TODO?Auto-generated?catch?block??
????????????????e.printStackTrace();??
????????????}??
????????}??
????}??
}??
~~~
自JDK5之后,可以用ScheduledThreadPoolExecutor來替代Timer。
- 前言
- Java線程(一):線程安全與不安全
- Java線程(二):線程同步synchronized和volatile
- Java線程(三):線程協作-生產者/消費者問題
- Java線程(四):線程中斷、線程讓步、線程睡眠、線程合并
- Java線程(五):Timer和TimerTask
- Java線程(六):線程池
- Java線程(七):Callable和Future
- Java線程(八):鎖對象Lock-同步問題更完美的處理方式
- Java線程(九):Condition-線程通信更高效的方式
- Java線程(十):CAS
- Java線程(十一):Fork/Join-Java并行計算框架
- Java線程(篇外篇):阻塞隊列BlockingQueue
- Java線程(篇外篇):線程本地變量ThreadLocal
- Java線程(篇外篇):線程和鎖