所有类型的 Java 应用程序一般都需要计划重复执行的任务。企业应用程序需要计划每日的日志或者晚间批处理过程。一个 J2SE或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间。不过,标准的调度类 Timer 和 TimerTask 没有足够的灵活性,无法支持通常需要的计划任务类型.
一、Timer
public class Timer extends Object
一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。
对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。默认情况下,任务执行线程并不作为守护线程 来运行,所以它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程,那么调用者应该调用计时器的 cancel 方法。
如果意外终止了计时器的任务执行线程,例如调用了它的 stop 方法,那么所有以后对该计时器安排任务的尝试都将导致 IllegalStateException,就好像调用了计时器的 cancel 方法一样。
二、构造函数以及主要方法
2.1、构造函数
Timer()
Timer(boolean isDaemon)
Timer(String name)
Timer(String name, boolean isDaemon)
2.2、主要方法
void schedule(TimerTask task, Date time)
void schedule(TimerTask task, Date firstTime, long period)
三、简单测试使用
3.1、自定义的MyTimerTask类
1 package org.timer.test; 2 3 import java.util.Timer; 4 import java.util.TimerTask; 5 6 public class MyTimerTask extends TimerTask { 7 8 @Override 9 public void run() {10 System.out.println("MyTimerTask---");11 new Timer().schedule(new MyTimerTask(), 2000);12 }13 14 }
3.2、测试类
1 package org.timer.test; 2 3 import java.util.Date; 4 import java.util.Timer; 5 6 public class TimerTest2 { 7 8 /** 9 * @param args10 */11 public static void main(String[] args) {12 13 new Timer().schedule(new MyTimerTask(), 2000);14 15 16 while(true){17 try {18 Thread.sleep(1000);19 } catch (InterruptedException e) {20 21 e.printStackTrace();22 }23 System.out.println(new Date().getSeconds());24 }25 }26 27 }
四、测试结果:
MyTimerTask---
590MyTimerTask---12MyTimerTask---34MyTimerTask---56MyTimerTask---78MyTimerTask---910MyTimerTask---1112MyTimerTask---1314MyTimerTask---1516MyTimerTask---1718MyTimerTask---1920MyTimerTask---2122MyTimerTask---2324MyTimerTask---2526MyTimerTask---2728MyTimerTask---2930MyTimerTask---3132MyTimerTask---33每隔2s打印一次MyTimerTask--,