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

  1. 1. public void schedule(TimerTask taskDate time) 这个方法中如启动时,已经过了time的时间,则系统会在启动后直接执行一次,
  1. 话不多少直接上代码
  1. package com.test.timer.task;
  2.  
  3. import java.text.DateFormat;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Calendar;
  6. import java.util.Date;
  7. import java.util.Timer;
  8. import java.util.TimerTask;
  9.  
  10. import org.junit.Test;
  11.  
  12. /**
  13. *
  14. * java实现定时器的若干方法
  15. *
  16. * @author jimi
  17. *
  18. */
  19. public class TestTask {
  20.  
  21. private static Timer timer = new Timer();
  22.  
  23. private static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
  24.  
  25. public static void main(String[] args){
  26. Calendar calendar = Calendar.getInstance();
  27. int year = calendar.get(Calendar.YEAR);
  28. int month = calendar.get(Calendar.MONTH);
  29. int day = calendar.get(Calendar.DAY_OF_MONTH);
  30. calendar.set(year,month,day,20,35,00);
  31.  
  32. //如果这个时间已经过了,则会启动会立即执行一次
  33. timer.schedule(new TimerTask() {
  34. @Override
  35. public void run() {
  36. System.out.println("固定执行任务的时间:" + dateFormat.format(new Date()));
  37. }
  38. }, calendar.getTime());
  39. }
  40.  
  41. }
  1. 代码中我指定在当天的2035分执行,启动程序后的结果如下:
  2.  

  3. 可以看到我程序是在20:40:47执行的,已经超过我设置的203500秒,所以启动后直接执行一次。

  1. 2. schedule(TimerTask tasklong delay,long period) scheduleAtFixedRate(TimerTask tasklong delay,long period)方法的区别
    简单来说就是定时执行scheduleAtFixedRate不受外界影响,假如某一次TimerTask执行时间超过了定时执行周期,下一次执行时间不会受该任务执行时间的影响,
    依然会在指定时间执行,而
    schedule则会受影响,直接上代码来看:
  1. package com.test.timer.task;
  2.  
  3. import java.text.DateFormat;
  4. import java.text.ParseException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import java.util.Timer;
  8. import java.util.TimerTask;
  9.  
  10. /**
  11. *
  12. * java实现定时器的若干方法
  13. *
  14. * @author jimi
  15. *
  16. */
  17. public class TestTask {
  18.  
  19. private static Timer timer = new Timer();
  20.  
  21. private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  22.  
  23. private static int index = 0;
  24.  
  25. public static void main(String[] args) throws ParseException{
  26.  
  27. //固定速率
  28. timer.scheduleAtFixedRate(new TimerTask() {
  29. @Override
  30. public void run() {
  31. index++;
  32. if (index % 5 == 0){
  33. try {
  34. Thread.sleep(5000);
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. System.out.println("每隔4秒执行一次:" + dateFormat.format(new Date()));
  40. }
  41. }, 0, 4000);
  42.  
  43. }
  44.  
  45. }
  1.  

从代码可以看出,在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的代码和执行情况

  1. package com.test.timer.task;
  2.  
  3. import java.text.DateFormat;
  4. import java.text.ParseException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import java.util.Timer;
  8. import java.util.TimerTask;
  9.  
  10. /**
  11. *
  12. * java实现定时器的若干方法
  13. *
  14. * @author jimi
  15. *
  16. */
  17. public class TestTask {
  18.  
  19. private static Timer timer = new Timer();
  20.  
  21. private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  22.  
  23. private static int index = 0;
  24.  
  25. public static void main(String[] args) throws ParseException{
  26.  
  27. //非固定速率
  28. timer.schedule(new TimerTask() {
  29.  
  30. @Override
  31. public void run() {
  32. index++;
  33. if (index % 5 == 0){
  34. try {
  35. Thread.sleep(5000);
  36. } catch (InterruptedException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. System.out.println("每隔4秒执行一次:" + dateFormat.format(new Date()));
  41. }
  42. }, 0, 4000);
  43. }
  44.  
  45. }

执行情况如下

  1. 每隔4秒执行一次:2018-08-10 19:17:12
  2. 每隔4秒执行一次:2018-08-10 19:17:16
  3. 每隔4秒执行一次:2018-08-10 19:17:20
  4. 每隔4秒执行一次:2018-08-10 19:17:24
  5. 每隔4秒执行一次:2018-08-10 19:17:33
  6. 每隔4秒执行一次:2018-08-10 19:17:33
  7. 每隔4秒执行一次:2018-08-10 19:17:37
  8. 每隔4秒执行一次:2018-08-10 19:17:41
  9. 每隔4秒执行一次:2018-08-10 19:17:45
  10. 每隔4秒执行一次:2018-08-10 19:17:54
  11. 每隔4秒执行一次:2018-08-10 19:17:54
  12. 每隔4秒执行一次:2018-08-10 19:17:58

可以看出schedule在执行完第5、6次任务后,第7次的时间则是按照定时计划4秒后执行的,可见schedule在任务执行过程中,如果某一次任务延时,则后续任务会跟着延时后的时间重新计算定时执行时间。

好了,小编今天就先码到这里,后面可能还会再介绍spring的定时任务,以及spring+quartz实现的定时任务。

  1.  
  1.  
  1.  
  1.  
  1.  

java之定时器任务Timer用法的更多相关文章

  1. Java中定时器Timer致命缺点(附学习方法)

    简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...

  2. java多线程--定时器Timer的使用

    定时的功能我们在手机上见得比较多,比如定时清理垃圾,闹钟,等等.定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术. Time类主要负责完成定时计划任务的功能,就是在指定 ...

  3. java的定时器用法

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

  4. Java进阶(十八)Java实现定时器(Timer)

    Java实现定时器(Timer) 绪 在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类.java.u ...

  5. java web 项目中 简单定时器实现 Timer

    java web 项目中 简单定时器实现 Timer 标签: Java定时器 2016-01-14 17:28 7070人阅读 评论(0) 收藏 举报  分类: JAVA(24)  版权声明:本文为博 ...

  6. java Quartz定时器任务与Spring task定时的几种实现,

    java Quartz定时器任务与Spring task定时的几种实现 基于java 的定时任务实现, Quartz 时间详细配置    请查阅   http://www.cnblogs.com/si ...

  7. Java学习笔记 -- Java定时调度工具Timer类

    1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...

  8. Spring 定时器Quartz的用法

    Spring定时器Quartz的用法也很简单,需要引入quartz-all-1.5.2.jar java代码如下: package com.coalmine.desktop; import java. ...

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

    C# Timer用法有哪些呢?我们在使用C# Timer时都会有自己的一些总结,那么这里向你介绍3种方法,希望对你了解和学习C# Timer使用的方法有所帮助. 关于C# Timer类  在C#里关于 ...

随机推荐

  1. A + B,末k位不相同

    题目描述 读入两个小于10000的正整数A和B,计算A+B.需要注意的是:如果A和B的末尾K(不超过8)位数字相同,请直接输出-1. 输入描述: 测试输入包含若干测试用例,每个测试用例占一行,格式为& ...

  2. Failed to write core dump. Minidumps are not enabled by default on client versions of Windows

    使用JProfiler监控JAVA程序内存,JVM报错: A fatal error has been detected by the Java Runtime Environment: EXCEPT ...

  3. 小程序Promise不支持finally解决方案

    小程序Promise不支持finally解决方案 代码片段 点击链接即可在微信开发者工具中查看代码wechatide://minicode/t2eidemj7P3X git地址 基本思路 小程序的Pr ...

  4. Ubuntu18.04下vim的tab缩进设置为4个空格

    在/etc/vim/vimrc最后添加如下内容 set ts = 4 set exbandtab set autoindent

  5. 分享一款Markdown的css样式

    使用 本样式在这个样式的基础上做了一些修改, 主要是对于表格和代码块以及一些细节的修改. 主要目的是用在chrome的扩展 Markdown Preview Plus中, 替换其内置的样式. 由于 M ...

  6. python3爬虫一

    1.环境安装: 在py3env(虚拟环境)下安装scrapy,新建项目: pip install scrapy scrapy startproject ArticleSpider cd Article ...

  7. Windows和Mac上NodeJS和Express的安装

    一.安装NodeJS,官网上下载,https://nodejs.org/en/ 直接下一步安装就行了. 打开命令行工具,输入 node -v 则会出现node的版本,则成功了. 下面我们介绍如何安装e ...

  8. Software development skills for data scientists

    Software development skills for data scientists Data scientists often come from diverse backgrounds ...

  9. bat判断ini文件内容

    @echo off for /f "tokens=1" %%d in (config.ini) do ( if /I "%%d" equ "path= ...

  10. MFC 使用用指定USB设备串口

    在做设备串口通讯时,往往需要自动连接到想要连接的usb转串口设备上. #include <Setupapi.h> int CMFCApplication1Dlg::FindUSBCOM() ...