日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用ScheduledThreadPoolExecutor代替TimerTimerTask

發布時間:2025/3/13 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用ScheduledThreadPoolExecutor代替TimerTimerTask 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? 如果我們想要延遲(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;
  • /**
  • * 自定義Timer類
  • *
  • */
  • 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); // 5秒后開始鳴叫,鳴叫10次,每次相隔1秒鐘
  • }
  • }
  • 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。