JDK 1.5開始提供ScheduledThreadPoolExecutor類,ScheduledThreadPoolExecutor類繼承ThreadPoolExecutor類重用執行緒池實現了任務的週期性排程功能。在JDK 1.5之前,實現任務的週期性排程主要使用的是Timer類和TimerTask類。本文,就簡單介紹下ScheduledThreadPoolExecutor類與Timer類的區別,ScheduledThreadPoolExecutor類相比於Timer類來說,究竟有哪些優勢,以及二者分別實現任務排程的簡單範例。
通過以上對ScheduledThreadPoolExecutor類和Timer類的分析對比,相信在JDK 1.5之後,就沒有使用Timer來實現定時任務排程的必要了。
這裡,給出使用Timer和ScheduledThreadPoolExecutor實現定時排程的簡單範例,為了簡便,我這裡就直接使用匿名內部類的形式來提交任務。
原始碼範例如下所示。
package io.binghe.concurrent.lab09;
import java.util.Timer;
import java.util.TimerTask;
/**
* @author binghe
* @version 1.0.0
* @description 測試Timer
*/
public class TimerTest {
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("測試Timer類");
}
}, 1000, 1000);
Thread.sleep(10000);
timer.cancel();
}
}
執行結果如下所示。
測試Timer類
測試Timer類
測試Timer類
測試Timer類
測試Timer類
測試Timer類
測試Timer類
測試Timer類
測試Timer類
測試Timer類
原始碼範例如下所示。
package io.binghe.concurrent.lab09;
import java.util.concurrent.*;
/**
* @author binghe
* @version 1.0.0
* @description 測試ScheduledThreadPoolExecutor
*/
public class ScheduledThreadPoolExecutorTest {
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("測試測試ScheduledThreadPoolExecutor");
}
}, 1, 1, TimeUnit.SECONDS);
//主執行緒休眠10秒
Thread.sleep(10000);
System.out.println("正在關閉執行緒池...");
// 關閉執行緒池
scheduledExecutorService.shutdown();
boolean isClosed;
// 等待執行緒池終止
do {
isClosed = scheduledExecutorService.awaitTermination(1, TimeUnit.DAYS);
System.out.println("正在等待執行緒池中的任務執行完成");
} while(!isClosed);
System.out.println("所有執行緒執行結束,執行緒池關閉");
}
}
執行結果如下所示。
測試測試ScheduledThreadPoolExecutor
測試測試ScheduledThreadPoolExecutor
測試測試ScheduledThreadPoolExecutor
測試測試ScheduledThreadPoolExecutor
測試測試ScheduledThreadPoolExecutor
測試測試ScheduledThreadPoolExecutor
測試測試ScheduledThreadPoolExecutor
測試測試ScheduledThreadPoolExecutor
測試測試ScheduledThreadPoolExecutor
正在關閉執行緒池...
測試測試ScheduledThreadPoolExecutor
正在等待執行緒池中的任務執行完成
所有執行緒執行結束,執行緒池關閉
注意:關於Timer和ScheduledThreadPoolExecutor還有其他的使用方法,這裡,我就簡單列出以上兩個使用範例,更多的使用方法大家可以自行實現。