使用ScheduledThreadPoolExecutor代替Timer&TimerTask

        如果我们想要延迟(deferred)或者周期性(periodic)执行一个任务,我们可以使用Java API 的Timer和TimerTask类。

一般步骤是:

继承TimerTask(抽象类),复写run方法,方法体里代表需要执行的任务。

实例化Timer(可以通过构造方法设置为守护线程),调用schedule的一个重载方法实现延迟或者周期性执行自定义任务。

下面的例子演示了程序启动5秒后每隔1秒警报器叫一声,10次后终止程序执行。

Java代码 复制代码 收藏代码
  1. import java.awt.Toolkit;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. /**
  5. * 自定义Timer类
  6. *
  7. */
  8. class BeepTimer extends TimerTask {
  9. private Toolkit toolKit;
  10. private int count;
  11. public BeepTimer() {
  12. toolKit = Toolkit.getDefaultToolkit();
  13. }
  14. @Override
  15. public void run() {
  16. if (count == 10)
  17. System.exit(1);
  18. toolKit.beep();
  19. count++;
  20. }
  21. }
  22. public class TimerDemo {
  23. public static void main(String... args) {
  24. BeepTimer bt = new BeepTimer(); //非守护线程
  25. Timer timer = new Timer();
  26. timer.schedule(bt, 5 * 1000, 1 * 1000); // 5秒后开始鸣叫,鸣叫10次,每次相隔1秒钟
  27. }
  28. }

但是Timer和TimerTask存在一些缺陷:

1:Timer只创建了一个线程。当你的任务执行的时间超过设置的延时时间将会产生一些问题。

2:Timer创建的线程没有处理异常,因此一旦抛出非受检异常,该线程会立即终止。

JDK 5.0以后推荐使用ScheduledThreadPoolExecutor。该类属于Executor Framework,它除了能处理异常外,还可以创建多个线程解决上面的问题。

下面利用ScheduledThradPoolExecutor实现同一个功能。

Java代码 复制代码 收藏代码
  1. import java.awt.Toolkit;
  2. import java.util.concurrent.ScheduledThreadPoolExecutor;
  3. import java.util.concurrent.TimeUnit;
  4. public class ExecutorDemo {
  5. public static void main(String... args) {
  6. ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(10);
  7. MyTask myTask = new MyTask();
  8. stpe.scheduleWithFixedDelay(myTask, 5,1,TimeUnit.SECONDS);
  9. }
  10. private static class MyTask implements Runnable {
  11. private Toolkit toolKit;
  12. private int count;
  13. public MyTask() {
  14. toolKit = Toolkit.getDefaultToolkit();
  15. }
  16. @Override
  17. public void run() {
  18. if(count == 10) {
  19. System.out.println("Termination!");
  20. System.exit(1);
  21. }
  22. toolKit.beep();
  23. System.out.println("Beep--------");
  24. count++;
  25. }
  26. }
  27. }

posted on 2013-02-05 16:35  蜜雪薇琪  阅读(307)  评论(0编辑  收藏  举报