java中Timer类的使用

来源:互联网 发布:淘宝贷款15万交3000 编辑:程序博客网 时间:2024/05/29 18:54

Timer类负责计划任务的功能,也即指定的时间开始执行某个任务。

Timer类的作用只是用于设置计划任务,对任务做排期,而任务的封装类则通过TimerTask完成。

执行计划任务的代码要放入TimerTask的子类中,因为TimerTask为抽象类,具体功能均由子类处理。

而TimerTask实现Runnable接口,Timer中TimerThread类继承与Thread类,

底层构建线程对象,调用start启动线程执行任务。

一 schedule(TimerTask task, Date time)方法使用

新建任务:

package com.lanhuigu.JavaBase.thread.schedule;import java.util.TimerTask;/** * 新建一个任务继承于TimerTask */public class MyTask extends TimerTask{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("The task begin startTime:" + System.currentTimeMillis());}}

测试类:

package com.lanhuigu.JavaBase.thread.schedule;import java.util.Calendar;import java.util.Date;import java.util.Timer;/** * Timer类负责计划任务的功能,也即指定的时间开始执行某个任务。 * Timer类的作用只是用于设置计划任务,对任务做排期,而任务的封装类则通过TimerTask完成。 * 执行计划任务的代码要放入TimerTask的子类中,因为TimerTask为抽象类,具体功能均由子类处理。 */public class RunTest {public static void main(String[] args) {System.out.println("curSystemTime:" + new Date());Calendar calendar = Calendar.getInstance();calendar.add(Calendar.SECOND, 10);Date runStartDate = calendar.getTime();/* * 新建一个任务 */MyTask task = new MyTask();/* * 定义一个任务调度器  */Timer timer = new Timer();/* * 将task任务交给timer去安排执行, * 什么时候执行由timer决定, * 执行什么内容由task决定 */timer.schedule(task, runStartDate);}}
运行结果:


从运行结果可以看到,当task都运行结束后,线程并未结束,控制台按钮仍处于红色。

这是由于Timer底层代码决定的:

public Timer() {        this("Timer-" + serialNumber());    }
public Timer(String name) {        thread.setName(name);        thread.start();    }
timer构造器重新启动一个线程,新线程并不是一个守护线程,所以一直处于运行状态。

修改测试代Timer timer = new Timer(true);从底层代码可以看出,设置为守护线程。

public Timer(boolean isDaemon) {        this("Timer-" + serialNumber(), isDaemon);    }

public Timer(String name, boolean isDaemon) {        thread.setName(name);        thread.setDaemon(isDaemon);        thread.start();    }
如果修改为守护线程,执行RunTest结果为:

从运行结果可以看出,MyTask中的task任务并没有执行,因为守护线程启动后瞬间就结束了,所以任务没有执行。

二 Timer中允许有多个TimerTask任务,以及出现执行延迟现象

TimerTask执行的顺序以队列的方式执行,可能出现延迟的现象,因为某个任务可能消耗时间过长。

新建Task任务:

package com.lanhuigu.JavaBase.thread.schedule;import java.util.TimerTask;/** * 新建一个任务继承于TimerTask */public class MyTask extends TimerTask{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("The task begin startTime:" + System.currentTimeMillis());}}
测试类:

package com.lanhuigu.JavaBase.thread.schedule;import java.util.Calendar;import java.util.Date;import java.util.Timer;/** * Timer类负责计划任务的功能,也即指定的时间开始执行某个任务。 * Timer类的作用只是用于设置计划任务,对任务做排期,而任务的封装类则通过TimerTask完成。 * 执行计划任务的代码要放入TimerTask的子类中,因为TimerTask为抽象类,具体功能均由子类处理。 */public class RunTest {public static void main(String[] args) {System.out.println("curSystemTime:" + new Date());Calendar calendar1 = Calendar.getInstance();calendar1.add(Calendar.SECOND, 10);Date runStartDate1 = calendar1.getTime();Calendar calendar2 = Calendar.getInstance();calendar2.add(Calendar.SECOND, 15);Date runStartDate2 = calendar2.getTime();/* * 新建一个任务 */MyTask task1 = new MyTask();MyTask task2 = new MyTask();/* * 定义一个任务调度器  */Timer timer = new Timer();/* * 将task任务交给timer去安排执行, * 什么时候执行由timer决定, * 执行什么内容由task决定 */timer.schedule(task1, runStartDate1);timer.schedule(task2, runStartDate2);}}
运行结果:

curSystemTime:Sat Aug 05 11:57:28 CST 2017
The task begin startTime:1501905458301
The task begin startTime:1501905463309

运行结果显示,第二个任务运行时间延后,这是因为TimerTask以队列的方式

一个一个的执行,前面的任务执行消耗的时间可能过程,导致后面的任务处于等待执行,

只有等前面的任务执行完,后面的任务才会执行,所以后面的任务可能被延后执行。

三 schedule(TimerTask task, Date firstTime, long period)使用

firstTime开始执行task,之后每隔一段时间一次task。

创建task:

package com.lanhuigu.JavaBase.thread.schedule;import java.util.TimerTask;/** * 新建一个任务继承于TimerTask */public class MyTask extends TimerTask{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("The task begin startTime:" + System.currentTimeMillis());}}

测试类:

package com.lanhuigu.JavaBase.thread.schedule;import java.util.Calendar;import java.util.Date;import java.util.Timer;/** * Timer类负责计划任务的功能,也即指定的时间开始执行某个任务。 * Timer类的作用只是用于设置计划任务,对任务做排期,而任务的封装类则通过TimerTask完成。 * 执行计划任务的代码要放入TimerTask的子类中,因为TimerTask为抽象类,具体功能均由子类处理。 */public class RunTest {public static void main(String[] args) {System.out.println("curSystemTime:" + new Date());Calendar calendar = Calendar.getInstance();calendar.add(Calendar.SECOND, 10);Date runStartDate = calendar.getTime();/* * 新建一个任务 */MyTask task = new MyTask();/* * 定义一个任务调度器  */Timer timer = new Timer();/* * 将task任务交给timer去安排执行, * 什么时候执行由timer决定, * 执行什么内容由task决定 */timer.schedule(task, runStartDate, 3000);}}

测试结果:

从runStartDate开始执行任务,每隔3秒执行一次task。


总结:

Timer定时器的实现,底层使用的是线程,包含有很多处理方法。