Timer和TimerTask能夠作爲實現線程的第三種方式,前兩中方式分別是繼承自Thread類和實現Runnable接口。 java
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秒後爆炸一次,如此循環下去,這就須要建立兩個任務,互相調度,代碼以下: app
- 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。 spa