Java定时器——Timer详解
Timer 详解
Timer 和 TimerTask 用于在后台线程中调度任务的 java.util 类。 TimerTask 负责任务的执行, Timer 负责任务的调度。
定时功能
Timer 提供了三种定时模式:
fixed delay fixed rate
执行一次
Timer 提供了两种方法,应用于不同场景:
//在当前时间往后delay个毫秒开始执行 public void schedule(TimerTask task, long delay) {...} //在指定的time时间点执行 public void schedule(TimerTask task, Date time) {...} 复制代码
public static void main(String[] args) { //定义一个Timer Timer timer = new Timer("test-timer"); //定义一个TimerTask TimerTask task = new TimerTask() { @Override public void run() { System.out.println("任务执行时间:" + new Date() + "------------" + "线程:" + Thread.currentThread().getName()); } }; long delay = 3000L; timer.schedule(task, delay); System.out.println("任务添加时间:" + new Date() + "------------" + "线程:" + Thread.currentThread().getName()); } 复制代码
工作方式:当达到我们指定的时间,执行一次结束
任务虽然运行结束,但进程没有被销毁。并且执行任务的线程名为我们定义的 Timer 的名称。我们看一下源码:
public class Timer { //小顶堆,用来存放timeTask private final TaskQueue queue = new TaskQueue(); private final TimerThread thread = new TimerThread(queue); public Timer(String name) { thread.setName(name); thread.start(); } } public abstract class TimerTask implements Runnable { long nextExecutionTime; long period = 0; public abstract void run(); } 复制代码
-
TaskQueue :基于小顶堆实现,用来存放 timerTask TimerThread :任务执行线程,继承 Thread 类 nextExecutionTime :假如任务需要多次执行表示下一次执行时间 period :每次任务执行间隔时间 run() :我们执行任务的内容
创建一个 Timer 对象就是新启动了一个线程,但是这个新启动的线程,并不是守护线程,它一直在后台运行,通过如下 可以将新启动的 Timer 线程设置为守护线程。我们可以使用以下构造方法( public Timer(boolean isDaemon) 或 public Timer(String name, boolean isDaemon) )来设置。
Fixed Delay 模式
//从当前时间开始delay个毫秒数开始定期执行,周期是period个毫秒数 public void schedule(TimerTask task, long delay, long period) {...} 从指定的firstTime开始定期执行,往后每次执行的周期是period个毫秒数 public void schedule(TimerTask task, Date firstTime, long period){...} 复制代码
工作方式:
TimerThread period