1. 使用Timer + TimerTask
在主程式中,Timer會使用schedule方法來安排想要執行的工作和執行的時間區隔,而需要被執行的工作(類別)只需要去繼承TimerTask類別,同時覆寫run方法即可。TimerTask是想要被執行的工作類別,繼承TimerTask類別,同時將想要被執行的工作寫在run方法中:
import java.util.Date;
import java.util.TimerTask;
public class TimeTask extends TimerTask{
@Override
public void run() {
System.out.println("my job : " + new Date());
}
}
而在主程式中,則是利用Timer類別的schedule方法來安排執行時間區隔:
import java.util.Timer;
public class TimerTest{
public static void main(String [] args) {
Timer timer = new Timer();
long delayTime = 1 * 1000;
long period = 2 * 1000;
timer.schedule(new TimeTask(), delayTime, period);
}
}
在schedule方法中給定三個參數第一個代表欲執行的工作,第二個參數代表在第一次執行工作前先延遲多久時間,第三個參數代表每間隔多少時間執行一次工作。
2. 使用ScheduledExecutorService
上面的Timer方法的一個缺點就是它是以Single Thread的方式來處理任務,如果你需要數個執行緒來同時執行不同任務時,Timer就不是這麼適合,這時候Java提供另外一種類別 - ScheduledExecutorService。
public class MyJob implements Runnable{
private String jobName = "";
MyJob(String name) {
this.jobName = name;
}
@Override
public void run() {
System.out.println(jobName);
}
}
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorTest {
public static void main(String [] args) {
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
service.scheduleAtFixedRate(new MyJob("job1"), 1, 1, TimeUnit.SECONDS);
service.scheduleAtFixedRate(new MyJob("job2"), 1, 1, TimeUnit.SECONDS);
}
}
在上面的例子中,在我們想要被執行的任務類別(MyJob)中,去實作Runnable介面,將任務放在Run方法中。主程式當中, 我們利用newScheduledThreadPool方法來建立ThreadPool,並把它指派給ScheduledExecutorService的instance,最後利用scheduleAtFixedRate方法,傳入四個參數,分別是:欲執行的類別、第一次執行前要delay的時間、每次執行的時間間隔、時間單位。
要特別注意的是,想要被ScheduleAtFixRate方法所呼叫的欲執行類別都必須要實作Runnable介面。這一點可以由 ScheduledExecutorService的API中得知。
1 意見:
可以考慮Quartz,以前我們都是用Spring+Quartz
張貼留言