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

 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() {
@Override
public 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() {
@Override
public 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() { @Override
public 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实现的定时任务。

												

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

  1. Java的Timer定时器

    Timer主要用于Java线程里指定时间或周期运行任务,它是线程安全的,但不提供实时性(real-time)保证. 上面提到了守护线程的概念. Java分为两种线程:用户线程和守护线程. 所谓守护线程 ...

  2. java Timer定时器管理类

    1.java timer类,定时器类.启动执行定时任务方法是timer.schedule(new RemindTask(), seconds*1000);俩参数分别是TimerTask子类,具体执行定 ...

  3. 定时任务:Java中Timer和TimerTask的使用

    java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerT ...

  4. Java中Timer和TimerTask的使用

    转自:http://www.cdtarena.com/javapx/201306/8893.html java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个 ...

  5. java.util.Timer类似于闹钟定时做任务

    在web中实现任务计划,相当于实现闹钟的功能,要完成2个步骤: 1.定时器的设置: 2.对这个定时器的启动运行和停止进行实时监听 java.util.Timer定时器,实际上是个线程,定时调度所拥有的 ...

  6. Java Timer定时器时,每次重复执行了两次任务的解决方案

    web.xml监听配置 com.numenzq.mc.service.impl.TimerListener TimerListener类 public class TimerListener impl ...

  7. JAVA TIMER定时器

    备注:类实现ServletContextListener,在web.xml配置,之后服务启动该定时器类自动加载 package com.leadlt.common.util; import java. ...

  8. Java 中Timer和TimerTask 定时器和定时任务使用的例子

    转自:http://blog.csdn.net/kalision/article/details/7692796 这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求 Timer类是用来执行任 ...

  9. JAVA Timer定时器使用方法(二)

    JAVA  Timer 定时器测试 MyTask.java:package com.timer; import java.text.SimpleDateFormat;import java.util. ...

随机推荐

  1. Python常见数据结构-推导式

    推导式是一种重要的Python特性,是一种简单精炼创建Python数据结构的方式. 列表推导式,详细参考https://www.jianshu.com/p/0a269715a742 基本格式为:[表达 ...

  2. EwoMail开源邮件服务器软件搭建

    EwoMail开源邮件服务器软件简介 EwoMail是基于Linux的开源邮件服务器软件,集成了众多优秀稳定的组件,是一个快速部署.简单高效.多语言.安全稳定的邮件解决方案,帮助你提升运维效率,降低 ...

  3. stand up meeting 11/25/2015 暨sprint2总结

    今天在课堂上进行了小组项目的阶段性总结,这两天小组内也是频繁的开会,具体细节我们已经反复核查,具体不表~ sprint2个人工作总结: 冯晓云:完成了必应词典在线查词api的调用和网络状况的检测:完成 ...

  4. DNA sequence HDU - 1560(IDA*,迭代加深搜索)

    题目大意:有n个DNA序列,构造一个新的序列,使得这n个DNA序列都是它的子序列,然后输出最小长度. 题解:第一次接触IDA*算法,感觉~~好暴力!!思路:维护一个数组pos[i],表示第i个串该匹配 ...

  5. 高级数据结构---红黑树及其插入左旋右旋代码java实现

    前面我们说到的二叉查找树,可以看到根结点是初始化之后就是固定了的,后续插入的数如果都比它大,或者都比它小,那么这个时候它就退化成了链表了,查询的时间复杂度就变成了O(n),而不是理想中O(logn), ...

  6. 通用Mapper使用

    通用Mapper介绍 产生背景 使用Mybatis的开发者大多会因为繁多的XML映射配置而头痛不已

  7. JS流程图解决方案GoJS

    GoJs简介 一个实现交互类图表(比如流程图,树图,关系图,力导图等等)的JS库 GoJS依赖于HTML5,所以请保证您的浏览器版本支持HTML5,当然还要加载这个库. 首先个人建议先下载官方实例的 ...

  8. 关于unix环境高级编程、Linux程序设计两部书浅谈

    unix环境高级编程的术语很多,概念内容,也很多,不过学习概念性质.标准规则类的东西,想必都是这样吧——需要进行拓展的内容很多. Linux程序设计,图文并茂,代码量够足,看起来,感觉难度还可以. l ...

  9. [Abp vNext 入坑分享] - 4.JWT授权的接入

    一.感想 在写这一系列文章之前,本来以为写这个之前已经搭建好的框架描述会比较简单,但是慢慢写下来才发现.写这个真的不简单额,本来以为图文一起,一个晚上应该能输出一篇吧...结果:现实真的骨感,一个星期 ...

  10. Jenkins(1)- centos7.X下安装Jenkins

    如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html 下载安装包 wget http:/ ...