Timer/TimerTask
Posted yifansj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Timer/TimerTask相关的知识,希望对你有一定的参考价值。
在JDK 5.0之前,java.util.Timer/TimerTask是唯一的内置任务调度方法,而且在很长一段时间里很热衷于使用这种方式进行周期性任务调度。
Timer类中常见方法
1、void cancel()
终止此计时器,丢弃所有当前已安排的任务。
2、 int purge()
从此计时器的任务队列中移除所有已取消的任务。
3、 void schedule(TimerTask task, Date time)
安排在指定的时间执行指定的任务。
4、 void schedule(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定延迟执行。
5、 void schedule(TimerTask task, long delay)
安排在指定延迟后执行指定的任务。
6、 void schedule(TimerTask task, long delay, long period)
安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
7、 void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定速率执行。
8、 void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
Timer/TimerTask的应用
首先我们定义了两个任务类,代码如下,所有关于Timer/TimerTask的Demo都是基于这两个Task。
class TimerTask1 extends TimerTask{ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public void run() { System.out.println(sdf.format(new Date())+" TimerTask1 begin running...,运行此任务的线程为:"+Thread.currentThread().getName()); try { Thread.sleep(1000);//模拟任务执行时间 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(sdf.format(new Date())+" TimerTask1 over...,运行此任务的线程为:"+Thread.currentThread().getName()); } } class TimerTask2 extends TimerTask{ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public void run() { System.out.println(sdf.format(new Date())+" TimerTask2 begin running...,运行此任务的线程为:"+Thread.currentThread().getName()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(sdf.format(new Date())+" TimerTask2 over...,运行此任务的线程为:" +Thread.currentThread().getName()); } }
TimerTask1采用睡眠1s来模拟任务的执行过程。TimerTask2采用睡眠2s来模拟任务的执行过程。
测试如下:
public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask1(), 0); timer.schedule(new TimerTask2(), 0); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } timer.cancel(); }
当定时器中添加了TimerTask1和TimerTask2两个任务,且都没有任何延时。
执行结果如下:
2016-08-05 10:44:36 TimerTask1 begin running...,运行此任务的线程为:Timer-0 2016-08-05 10:44:37 TimerTask1 over...,运行此任务的线程为:Timer-0 2016-08-05 10:44:37 TimerTask2 begin running...,运行此任务的线程为:Timer-0 2016-08-05 10:44:39 TimerTask2 over...,运行此任务的线程为:Timer-0
有运行结果可以得到的结论:
1、Timer类使用的是一个线程串行的执行提交的任务。
2、两个任务提交的执行的延时相等,则任务的执行顺序和提交的先后顺序一致。
既然任务的执行顺序和延时有关系,那么就看一个关于 有延时的例子,如下:
public static void main(String[] args) { Timer timer = new Timer(); timer.schedule(new TimerTask1(), 10);//延迟10ms后执行 timer.schedule(new TimerTask2(), 0); timer.schedule(new TimerTask2(), 5);//延迟5ms try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } timer.cancel(); }
以上是关于Timer/TimerTask的主要内容,如果未能解决你的问题,请参考以下文章