您的位置:首页 > 其它

使用ScheduledThreadPoolExecutor代替Timer&TimerTask

2014-01-20 09:35 330 查看
TimerTaskTimerScheduledThreadPoolExecutor定时器 .

如果我们想要延迟(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./**

6. * 自定义Timer类

7. *

8. */

9.class BeepTimer extends TimerTask {

10.

11. private Toolkit toolKit;

12.

13. private int count;

14.

15. public BeepTimer() {

16. toolKit = Toolkit.getDefaultToolkit();

17. }

18.

19. @Override

20. public void run() {

21. if (count == 10)

22. System.exit(1);

23. toolKit.beep();

24. count++;

25. }

26.

27.}

28.

29.public class TimerDemo {

30.

31. public static void main(String... args) {

32.

33. BeepTimer bt = new BeepTimer(); //非守护线程

34. Timer timer = new Timer();

35.

36. timer.schedule(bt, 5 * 1000, 1 * 1000); // 5秒后开始鸣叫,鸣叫10次,每次相隔1秒钟

37. }

38.

39.}

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秒钟

}

}

但是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.

5.public class ExecutorDemo {

6.

7. public static void main(String... args) {

8.

9. ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(10);

10. MyTask myTask = new MyTask();

11.

12. stpe.scheduleWithFixedDelay(myTask, 5,1,TimeUnit.SECONDS);

13. }

14.

15. private static class MyTask implements Runnable {

16.

17. private Toolkit toolKit;

18. private int count;

19.

20. public MyTask() {

21. toolKit = Toolkit.getDefaultToolkit();

22. }

23. @Override

24. public void run() {

25. if(count == 10) {

26. System.out.println("Termination!");

27. System.exit(1);

28. }

29. toolKit.beep();

30. System.out.println("Beep--------");

31. count++;

32. }

33. }

34.}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: