Java 定时调度

  • 格式:doc
  • 大小:44.50 KB
  • 文档页数:3

Java 定时调度(Timer和TimerTask)
不知道大家之前听说过定时调度没?如果没有听说过,这里我给大家几个小例子,如在
2009-5-6 晚上12点发送一个电子邮件、每隔五分钟向控制台输出当前时间等。这些都是
定时调度所涉及到的内容,今天我就给大家讲解下Java平台本身自带的定时调度类。这就
是Timer和TimerTask,顾名思义,Timer为定时器而TimerTask则为定时任务。
在一般的情况下,我们也可以用Thread来实现一个定时调度的任务系统,如启动一个后台
线程,然后里面的run方法是一个while(true)结构,接着使用Thread的sleep方法来定时
休眠,就可以实现。不过对于定时任务,Java中已经提供了Timer类来帮助我们完成这个
事情。
在进行讲解之前,首先给出个例子:
[java] view plaincopy

1. public class MainClass {
2.
3. public static void main(String[] args) {
4. Timer timer = new Timer();
5. timer.schedule(new DisplayQuestionTask(), 0, 10 * 1000);
6. try {
7. Thread.sleep(10000);
8. } catch (InterruptedException e) {
9. }
10. timer.cancel();
11. }
12. }
13.
14. class DisplayQuestionTask extends TimerTask {
15. int counter = 0;
16.
17. public void run() {
18. System.out.println(counter++);
19. }
20. }

执行上述代码的时候,大家可以看到,控制台并没有立即返回,而是等待了10秒才结束执
行;并且在控制台里也输出了0,1两个数字。我想稍微的给大家讲解下这个代码。在main
方法中,我们首先定义了一个Timer类,该类用于在后续代码中进行具体的时间调度,即
每隔多少时间进行调度,调度是通过schedule方法来实现的,该方法有很多多态方法,给
大家列举下:
[java] view plaincopy

1. void schedule(TimerTask task, Date time) //安排在指定的时间执行指定的任务。
2.
3. void schedule(TimerTask task, Date firstTime, long period) //安排指定的任务在
指定的时间开始进行重复的固定延迟执行。
4.
5. void schedule(TimerTask task, long delay) // 安排在指定延迟后执行指定的任务。
6.
7. void schedule(TimerTask task, long delay, long period) //安排指定的任务从指定
的延迟后开始进行重复的固定延迟执行。

从上面的代码可以看出,可以在指定时间执行、可以在指定时间开始执行然后每隔固定时间
循环执行、在固定延迟后执行一次调度、在固定延迟后执行一次然后每隔固定时间循环执行。
我们上面的代码用的显然是第四种方式,在方法调用后的0秒后执行一次然后每隔10秒执
行一次。这里注意下,Thread.sleep(10000);它的主要作用是防止主线程提前退出,给出一
个修改后的代码,大家自己运行下:
[java] view plaincopy

1. public class MainClass {
2.
3. public static void main(String[] args) {
4. Timer timer = new Timer();
5.
6. timer.schedule(new DisplayQuestionTask(), 0, 10 * 1000);
7.
8. /*try {
9. Thread.sleep(10000);
10. } catch (InterruptedException e) {
11. }*/
12. timer.cancel();
13. }
14. }
15.
16. class DisplayQuestionTask extends TimerTask {
17. int counter = 0;
18.
19. public void run() {
20. System.out.println(counter++);
21. }
22. }
该代码与开始的代码的主要差别是,我将Thread.sleep(10000)注释掉了。大家执行后可以
看出,代码会立即返回,控制台也没有任何输出。这里的主要原因是主线程没有等待,直接
退出,导致程序退出。

这里稍微注意下,在Java应用中,只有主线程存在,其他的线程才能够存在;如果主线程
退出了,那么程序就结束了。
然后在最后的语句中,我们调用了Timer的cancel方法,该方法的主要作用是终止计时器,
并将所有的任务都放弃。
了解了这么多,给大家一个比较有用的调度任务,它调用了Java的垃圾收集器,用于定时
进行垃圾回收,直接见代码:
[java] view plaincopy

1. public class MainClass {
2. public static void main(String[] args) {
3. Timer timer = new Timer();
4. GCTask task = new GCTask();
5. timer.schedule(task, 5000, 5000);
6. while (true) {
7. try {
8. Thread.sleep(500);
9. } catch (InterruptedException e) {
10. }
11. }
12. }
13. }
14. class GCTask extends TimerTask {
15. public void run() {
16. System.out.println("Running the scheduled task...");
17. System.gc();
18. }
19. }

大家在执行本代码后,会发现控制台一直不返回,这个主要是通过while(true)实现的。然后
在控制台上大家可以看到我们定义的输出。上面的代码完成的是每隔5秒执行一次垃圾回
收,回收没在用的内存。注意,该代码只是要求Java垃圾回收器来回收内存,但并不是调
用后Java垃圾收集器就会回收内存。

同时有一点没有提到,所有的定时任务都是继承自TimerTask,大家在使用的时候稍微注意
点。
OK,学了今天的知识相信大家可以用Timer来完成自己需要的任务了。有一点,如果能让
计算机去做的,尽量不要用人来做了,O(∩_∩)O哈哈~。充分发挥自己的想象力。顺便提一
下,在开源领域有一个更为强大的调度框架,名字是QuartZ,有机会会给大家讲解。