真是受夠了多線程的問題,今天開始就自己總結一下
Timer類和TimerTask類配合使用。Timer負責控制線程的執行時間,TimerTask中寫業務代碼,他實現了Runnable接口。但run()方法並沒有實現,是一個抽象類。
Timer提供的API :
schedule的不同重載方法可以,支持多少秒之後執行,間隔多長時間執行,具體某個Date執行,他提供的API並不強大,適合簡單的定時任務。比如10分鐘後執行。但複雜的定時任務,並沒有給出相應的API,比如,每隔一月的一號執行任務。如果有這樣的需求,則使用quartz。quartz這裏不做詳細解釋,以後的文章中可能再做詳解。
例:如何用timer和TimerTask實現 一個炸彈每隔2秒炸一次,另一個每隔3秒炸一次
package com.lipeng;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerDemo {
public static int count=0;
/**
* @param args
*/
public static void main(String[] args) throws Exception{
new Timer().schedule(new BoomTimeTask(), 2000);
while(true)
{
Thread.sleep(1000);
System.out.println(new Date().getSeconds());
}
}
}
class BoomTimeTask extends TimerTask
{
@Override
public void run() {
System.out.println("boom!!!!!!!!!!!!!!!!!!!!!!!!!");
TimerDemo.count++;
new Timer().schedule(new BoomTimeTask(), TimerDemo.count%2==0?2000:3000);
}
}
思路:
1.首先schedule方法中,schedule(TimerTask task, long delay) ,delay之後執行一邊線程就結束了,而schedule(TimerTask task, long delay, long period) 是delay後執行以後每period都會執行一遍run方法,並不會死掉。
2. 第一個炸彈啓動2秒之後炸,炸完啓動第二個炸彈,3秒之後第二個炸彈炸,再啓動一次第一個炸彈,如此循環。即遞歸的使用炸彈,調用炸彈的方法(run方法)。每次要執行的任務一樣即run方法,只不過每次的執行時間不同,每隔一次2,3秒輪流換。這就要求定義一個全局的標識count來做開關。
注:以上例子來自張孝祥老師的-Java多線程與併發庫高級應用