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定时器的实现,底层使用的是线程,包含有很多处理方法。
- java中timer类的使用
- java中Timer类的使用
- java中Timer的使用
- Java中Timer的使用
- Java中Timer的使用
- Java中Timer的使用
- Java中Timer的使用
- java中timer的使用
- java中Timer的使用
- Java中Timer类使用
- java 中javax.swing.timer类的初步使用
- 黑马程序员---java中Timer类的介绍以及使用
- Java中Timer,TimerTask的使用
- Java中Timer,TimerTask的使用
- java中Timer使用的简要说明
- java中Timer使用的简要说明
- java中定期执行--Timer的使用
- Java中Timer和TimerTask的使用
- Itext获取PDF图层名称
- 框架学习系列 mybatis 第五篇 mybatis入门程序之需求开发2根据用户名模糊查询
- 通过js判断打开页面的手机浏览器类型
- 推荐一款好用的Visual Studio插件
- LeetCode 543 Diameter of Binary Tree
- java中Timer类的使用
- Java基础(一)
- html5-canvas基础API
- 1.Android硬件访问服务框架
- Android BroadcastReceiver之修改来电号码
- PAT 乙级 1004
- 模板不支持分离编译------原因以及解决方法
- 表格(table)隔行换色
- Bootstrap Table使用整理(六)-常用操作