在项目开发中,经常会遇到需要实现一些定时操作的任务,写过很多遍了,然而每次写的时候,总是会对一些细节有所遗忘,后来想想可能是没有总结的缘故,所以今天小编就打算总结一下可能会被遗忘的小点:

 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用法相关推荐

  1. Java实现定时器(Timer)

    1.定时器的介绍 人类最早使用的定时工具是沙漏或水漏,但在钟表诞生发展成熟之后,人们开始尝试使用这种全新的计时工具来改进定时器,达到准确控制时间的目的.定时器确实是一项了不起的发明,使相当多需要人控制 ...

  2. python timer怎么用_python定时器(Timer)用法简单实例

    python定时器(Timer)用法简单实例 本文实例讲述了python定时器(Timer)用法.分享给大家供大家参考.具体如下: # encoding: UTF-8 import threading ...

  3. java的定时器用法

    java定时器的使用 定时器类Timer在java.util包中.使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在 ...

  4. Java定时器(Timer)

    1.介绍 Timer和TimerTask是用于在后台线程中调度任务的java util类.简单地说,TimerTask是要执行的任务,Timer是调度器. 2.调度一次性任务 2.1 指定延迟后执行 ...

  5. java捕获定时器抛出的异常_详细了解Java中定时器Timer的使用及缺陷分析

    在需要定时并且周期执行任务时,在最初的JAVA工具类库中,Timer可以实现任务的定时周期执行的需求,不过有一定的缺陷,比如,Timer是基于绝对时间而非相对时间,因此Timer对系统时钟比较敏感,本 ...

  6. C# Timer用法及实例详解

    1.C# Timer用法及实例详解 http://developer.51cto.com/art/200909/149829.htm http://www.cnblogs.com/OpenCoder/ ...

  7. Java当中定时器使用

    定时器类Timer在java.util包中.  * 使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在指定的延迟de ...

  8. 【修真院WEB小课堂】定时器有哪些用法?

    这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [定时器有哪些用 ...

  9. java web定时器_java的web项目中使用定时器 | 学步园

    之前接触过程序中的定时任务,但是没去自己亲自尝试过.终于这次抽空搞了一下.(一定要自己去操作,才能长经验,光看到过是没用的) 以下是两种方法,我使用的是监听的方法. JAVA WEB定时器,定时器的启 ...

最新文章

  1. 110道Python面试真题和面试简历资料(附链接)
  2. 低价电阻箱-阻值测试
  3. thinkphp v5.0.11漏洞_ThinkPHP5丨远程代码执行漏洞动态分析
  4. display:column常用属性解释
  5. Silverlight Code Samples
  6. c#中结构与类的区别(转)
  7. 【广告技术】用张量分解预测广告库存,广告投放更可靠!
  8. Deepin安装Eclipse
  9. Hive TopN+分组TopN
  10. Ant安装及环境配置
  11. 职高学计算机平面设计要买电脑吗,职高生学好计算机平面设计课之我见
  12. android 高仿网易,Android项目实战教程之高仿网易云音乐启动页实例代码
  13. 中国裁判文书网爬虫思路详细分析 (2018年11月上旬可用)
  14. [Luogu P3164] [BZOJ 3503] [CQOI2014]和谐矩阵
  15. Linux常用命令-时刻更新
  16. 电脑开机启动选择系统
  17. 怎样使用pdf转换器?一篇文章教会你
  18. 用python做线性规划
  19. matlab使用自带的拟合工具cftool对数据进行拟合并生成拟合函数代码
  20. 百度SEO发包快排解密

热门文章

  1. 曝iOS存在缺陷 黑客可强制iPhone拨打收费电话
  2. apache与tomcat连接
  3. iOS逆向工程的一些资料
  4. oracle之alter学习笔记
  5. 第二章:制作 yum 仓库和配置MTA-Postfix
  6. 请问一个跨进程调用的问题?
  7. Django REST framework API 指南(12):验证器
  8. 研究人员研发可自我修复的“电子皮肤”,重点是还能回收再利用
  9. 爱立信:SDN/NFV助力面向5G以及工业互联网的ICT转型
  10. Android与JS混编(js调用android相机扫描二维码)