? ? ? ? 如果我們想要延遲(deferred)或者周期性(periodic)執行一個任務,我們可以使用Java API 的Timer和TimerTask類。
一般步驟是:
繼承TimerTask(抽象類),復寫run方法,方法體里代表需要執行的任務。
實例化Timer(可以通過構造方法設置為守護線程),調用schedule的一個重載方法實現延遲或者周期性執行自定義任務。
下面的例子演示了程序啟動5秒后每隔1秒警報器叫一聲,10次后終止程序執行。
Java代碼
import java.awt.Toolkit; import java.util.Timer; import java.util.TimerTask; class BeepTimer extends TimerTask { private Toolkit toolKit; private int count; public BeepTimer() { toolKit = Toolkit.getDefaultToolkit(); } @Override public void run() { if (count == 10) System.exit(1); toolKit.beep(); count++; } } public class TimerDemo { public static void main(String... args) { BeepTimer bt = new BeepTimer(); Timer timer = new Timer(); timer.schedule(bt, 5 * 1000, 1 * 1000); } } import java.awt.Toolkit;
import java.util.Timer;
import java.util.TimerTask;/*** 自定義Timer類* */
class BeepTimer extends TimerTask {private Toolkit toolKit;private int count;public BeepTimer() {toolKit = Toolkit.getDefaultToolkit();}@Overridepublic void run() {if (count == 10)System.exit(1);toolKit.beep();count++;}}public class TimerDemo {public static void main(String... args) {BeepTimer bt = new BeepTimer(); //非守護線程Timer timer = new Timer();timer.schedule(bt, 5 * 1000, 1 * 1000); // 5秒后開始鳴叫,鳴叫10次,每次相隔1秒鐘}}
但是Timer和TimerTask存在一些缺陷:
1:Timer只創建了一個線程。當你的任務執行的時間超過設置的延時時間將會產生一些問題。
2:Timer創建的線程沒有處理異常,因此一旦拋出非受檢異常,該線程會立即終止。
JDK 5.0以后推薦使用ScheduledThreadPoolExecutor。該類屬于Executor Framework,它除了能處理異常外,還可以創建多個線程解決上面的問題。
下面利用ScheduledThradPoolExecutor實現同一個功能。
Java代碼
import java.awt.Toolkit; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ExecutorDemo { public static void main(String... args) { ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(10); MyTask myTask = new MyTask(); stpe.scheduleWithFixedDelay(myTask, 5,1,TimeUnit.SECONDS); } private static class MyTask implements Runnable { private Toolkit toolKit; private int count; public MyTask() { toolKit = Toolkit.getDefaultToolkit(); } @Override public void run() { if(count == 10) { System.out.println("Termination!"); System.exit(1); } toolKit.beep(); System.out.println("Beep--------"); count++; } } } import java.awt.Toolkit;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class ExecutorDemo {public static void main(String... args) {ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(10);MyTask myTask = new MyTask();stpe.scheduleWithFixedDelay(myTask, 5,1,TimeUnit.SECONDS);}private static class MyTask implements Runnable {private Toolkit toolKit;private int count;public MyTask() {toolKit = Toolkit.getDefaultToolkit();}@Overridepublic void run() {if(count == 10) {System.out.println("Termination!");System.exit(1);}toolKit.beep();System.out.println("Beep--------");count++;}}
}
轉載于:https://www.cnblogs.com/shhaoran/archive/2013/02/05/2924517.html
總結
以上是生活随笔為你收集整理的使用ScheduledThreadPoolExecutor代替TimerTimerTask的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。