今日看了《
Java Concurrency in Practice》的第6.2.5章節,才知道java.util.Timer真是問題多多啊。
Timer任務執行過程中,如果下一次計時到了,會產生任務沖突問題。這在多線程的環境下會更加突出。
另外如果Timer任務執行過程中發生異常,Timer仍然會繼續工作!
jdk5的java.util.concurrent.ScheduledExecutorService很好的解決了以上問題:
1 import java.util.concurrent.Executors;
2 import java.util.concurrent.ScheduledExecutorService;
3 import java.util.concurrent.ScheduledFuture;
4 import static java.util.concurrent.TimeUnit.*;
5
6 public class BeeperControl {
7
8 private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
9 private int count = 0;
10
11 public void beepForAnHour() {
12 final Runnable beeper = new Runnable() {
13
14 public void run() {
15 if (count == 5) {
16 int i = 1 / 0;
17 }
18 System.out.println(count++);
19 }
20 };
21 final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 5, 1, SECONDS);
22 scheduler.schedule(new Runnable() {
23
24 public void run() {
25 System.out.println("cancel!");
26 beeperHandle.cancel(true);
27 scheduler.shutdown();
28 }
29 }, 15, SECONDS);
30 }
31 }
PS:
Spring和EJB都有自己的定時任務功能,也是比較好的選擇。