通过使用java.util.Timer类和TimerTask类可以实现一个简单的计时器功能。
import java.util.TimerTask;
public class MySchedule extends TimerTask {
@Override
public void run() {
System.out.println("哈哈~我开始执行啦");
}
}
public static void main(String[] args) throws Exception{
Timer task = new Timer(true);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2010-11-22 15:07:30");
task.schedule(new MySchedule(), date);
System.out.println("ff");
}
}
Timer类是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
与每个
Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务 执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述令人讨厌的任务最终完成时才能够被快速连续地执行。
对
Timer 对象最后的引用完成后,
并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。默认情况下,任务执行线程并不作为
守护线程 来运行,所以它能够阻止应用程序终止。如果调用方想要快速终止计时器的任务执行线程,那么调用方应该调用计时器的
cancel 方法。
如果意外终止了计时器的任务执行线程,例如调用了它的
stop 方法,那么所有以后对该计时器安排任务的尝试都将导致
IllegalStateException,就好像调用了计时器的
cancel 方法一样。
此类是线程安全的:多个线程可以共享单个
Timer 对象而无需进行外部同步。
此类
不 提供实时保证:它使用
Object.wait(long) 方法来安排任务。
实现注意事项:此类可扩展到大量同时安排的任务(存在数千个都没有问题)。在内部,它使用二进制堆来表示其任务队列,所以安排任务的开销是 O(log n),其中 n 是同时安排的任务数。
实现注意事项:所有构造方法都启动计时器线程。
TimerTask由 Timer 安排为一次执行或重复执行的任务。
实现例子的代码如下:
//TimerTask
package com.kkoolerter;
import java.util.TimerTask;
public class MySchedule extends TimerTask {
@Override
public void run() {
System.out.println("哈哈~我开始执行啦");
}
}
//测试代码
package com.kkoolerter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
public class Main {
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
public class Main {
public static void main(String[] args) throws Exception{
Timer task = new Timer(true);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2010-11-22 15:07:30");
task.schedule(new MySchedule(), date);
System.out.println("ff");
}
}
Timer的内部通过一个TaskQueue队列来实现任务调度的管理。
参考文献:JDK文档和JDK源码
转载于:https://blog.51cto.com/wujuxiang/429313