java之定时器任务Timer用法
在项目开发中,经常会遇到需要实现一些定时操作的任务,写过很多遍了,然而每次写的时候,总是会对一些细节有所遗忘,后来想想可能是没有总结的缘故,所以今天小编就打算总结一下可能会被遗忘的小点:
1. public void schedule(TimerTask task,Date time) 这个方法中如启动时,已经过了time的时间,则系统会在启动后直接执行一次,
话不多少直接上代码
package com.test.timer.task;import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask;import org.junit.Test;/*** * java实现定时器的若干方法* * @author jimi**/ public class TestTask {private static Timer timer = new Timer();private static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");public static void main(String[] args){Calendar calendar = Calendar.getInstance();int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH);int day = calendar.get(Calendar.DAY_OF_MONTH);calendar.set(year,month,day,20,35,00);//如果这个时间已经过了,则会启动会立即执行一次timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("固定执行任务的时间:" + dateFormat.format(new Date()));}}, calendar.getTime());}}
代码中我指定在当天的20时35分执行,启动程序后的结果如下: 可以看到我程序是在20:40:47执行的,已经超过我设置的20时35分00秒,所以启动后直接执行一次。
2. schedule(TimerTask task,long delay,long period) 和 scheduleAtFixedRate(TimerTask task,long delay,long period)方法的区别 简单来说就是定时执行scheduleAtFixedRate不受外界影响,假如某一次TimerTask执行时间超过了定时执行周期,下一次执行时间不会受该任务执行时间的影响, 依然会在指定时间执行,而schedule则会受影响,直接上代码来看:
package com.test.timer.task;import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask;/*** * java实现定时器的若干方法* * @author jimi**/ public class TestTask {private static Timer timer = new Timer();private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");private static int index = 0;public static void main(String[] args) throws ParseException{//固定速率timer.scheduleAtFixedRate(new TimerTask() {@Overridepublic void run() {index++;if (index % 5 == 0){try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("每隔4秒执行一次:" + dateFormat.format(new Date()));}}, 0, 4000);}}
从代码可以看出,在index为5的倍数时,程序会休眠5秒,我们了来看看执行的结果
每隔4秒执行一次:2018-08-10 19:12:09
每隔4秒执行一次:2018-08-10 19:12:13
每隔4秒执行一次:2018-08-10 19:12:17
每隔4秒执行一次:2018-08-10 19:12:21
每隔4秒执行一次:2018-08-10 19:12:30
每隔4秒执行一次:2018-08-10 19:12:30
每隔4秒执行一次:2018-08-10 19:12:33
每隔4秒执行一次:2018-08-10 19:12:37
每隔4秒执行一次:2018-08-10 19:12:41
每隔4秒执行一次:2018-08-10 19:12:50
每隔4秒执行一次:2018-08-10 19:12:50
每隔4秒执行一次:2018-08-10 19:12:53
每隔4秒执行一次:2018-08-10 19:12:57
每隔4秒执行一次:2018-08-10 19:13:01
每隔4秒执行一次:2018-08-10 19:13:10
每隔4秒执行一次:2018-08-10 19:13:10
我们可以看出在第五次和第六次同时运行,且第七次的时间并未是在19:12:30的基础加4秒,而是在程序启动后预先计算好的时间也就是19:12:33秒,所可以看scheduleAtFixedRate的执行时间是按照预先的固定速率来执行,不会因为某一次的延迟而影响后面的计划时间。
我们再来看看schedule的代码和执行情况
package com.test.timer.task;import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask;/*** * java实现定时器的若干方法* * @author jimi**/ public class TestTask {private static Timer timer = new Timer();private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");private static int index = 0;public static void main(String[] args) throws ParseException{//非固定速率timer.schedule(new TimerTask() {@Overridepublic void run() {index++;if (index % 5 == 0){try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("每隔4秒执行一次:" + dateFormat.format(new Date()));}}, 0, 4000);}}
执行情况如下
每隔4秒执行一次:2018-08-10 19:17:12 每隔4秒执行一次:2018-08-10 19:17:16 每隔4秒执行一次:2018-08-10 19:17:20 每隔4秒执行一次:2018-08-10 19:17:24 每隔4秒执行一次:2018-08-10 19:17:33 每隔4秒执行一次:2018-08-10 19:17:33 每隔4秒执行一次:2018-08-10 19:17:37 每隔4秒执行一次:2018-08-10 19:17:41 每隔4秒执行一次:2018-08-10 19:17:45 每隔4秒执行一次:2018-08-10 19:17:54 每隔4秒执行一次:2018-08-10 19:17:54 每隔4秒执行一次:2018-08-10 19:17:58
可以看出schedule在执行完第5、6次任务后,第7次的时间则是按照定时计划4秒后执行的,可见schedule在任务执行过程中,如果某一次任务延时,则后续任务会跟着延时后的时间重新计算定时执行时间。
好了,小编今天就先码到这里,后面可能还会再介绍spring的定时任务,以及spring+quartz实现的定时任务。
转载于:https://www.cnblogs.com/ljy-20180122/p/9404426.html
java之定时器任务Timer用法相关推荐
- Java实现定时器(Timer)
1.定时器的介绍 人类最早使用的定时工具是沙漏或水漏,但在钟表诞生发展成熟之后,人们开始尝试使用这种全新的计时工具来改进定时器,达到准确控制时间的目的.定时器确实是一项了不起的发明,使相当多需要人控制 ...
- python timer怎么用_python定时器(Timer)用法简单实例
python定时器(Timer)用法简单实例 本文实例讲述了python定时器(Timer)用法.分享给大家供大家参考.具体如下: # encoding: UTF-8 import threading ...
- java的定时器用法
java定时器的使用 定时器类Timer在java.util包中.使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在 ...
- Java定时器(Timer)
1.介绍 Timer和TimerTask是用于在后台线程中调度任务的java util类.简单地说,TimerTask是要执行的任务,Timer是调度器. 2.调度一次性任务 2.1 指定延迟后执行 ...
- java捕获定时器抛出的异常_详细了解Java中定时器Timer的使用及缺陷分析
在需要定时并且周期执行任务时,在最初的JAVA工具类库中,Timer可以实现任务的定时周期执行的需求,不过有一定的缺陷,比如,Timer是基于绝对时间而非相对时间,因此Timer对系统时钟比较敏感,本 ...
- C# Timer用法及实例详解
1.C# Timer用法及实例详解 http://developer.51cto.com/art/200909/149829.htm http://www.cnblogs.com/OpenCoder/ ...
- Java当中定时器使用
定时器类Timer在java.util包中. * 使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在指定的延迟de ...
- 【修真院WEB小课堂】定时器有哪些用法?
这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [定时器有哪些用 ...
- java web定时器_java的web项目中使用定时器 | 学步园
之前接触过程序中的定时任务,但是没去自己亲自尝试过.终于这次抽空搞了一下.(一定要自己去操作,才能长经验,光看到过是没用的) 以下是两种方法,我使用的是监听的方法. JAVA WEB定时器,定时器的启 ...
最新文章
- 110道Python面试真题和面试简历资料(附链接)
- 低价电阻箱-阻值测试
- thinkphp v5.0.11漏洞_ThinkPHP5丨远程代码执行漏洞动态分析
- display:column常用属性解释
- Silverlight Code Samples
- c#中结构与类的区别(转)
- 【广告技术】用张量分解预测广告库存,广告投放更可靠!
- Deepin安装Eclipse
- Hive TopN+分组TopN
- Ant安装及环境配置
- 职高学计算机平面设计要买电脑吗,职高生学好计算机平面设计课之我见
- android 高仿网易,Android项目实战教程之高仿网易云音乐启动页实例代码
- 中国裁判文书网爬虫思路详细分析 (2018年11月上旬可用)
- [Luogu P3164] [BZOJ 3503] [CQOI2014]和谐矩阵
- Linux常用命令-时刻更新
- 电脑开机启动选择系统
- 怎样使用pdf转换器?一篇文章教会你
- 用python做线性规划
- matlab使用自带的拟合工具cftool对数据进行拟合并生成拟合函数代码
- 百度SEO发包快排解密