概述

主要用于Java线程里指定时间或周期运行任务。Timer是线程安全的,但不提供实时性(real-time)保证。
构造函数
Timer()
默认构造函数。
Timer(boolean)
指定关联线程是否作为daemon线程。
Timer(String)
指定关联线程的名称。
Timer(String, boolean)
同时指定关联线程的名称和是否作为daemon。
schdule方法
schedule(TimerTask task, long delay)
以当前时间为基准,延迟指定的毫秒后执行一次TimerTask任务。
schedule(TimerTask task, Date time)
在指定的日期执行一次TimerTask任务。
如果日期time早于当前时间,则立刻执行。
使用示例
public class Demo {
private static Timer timer = new Timer();
public static class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("Run Time:" + new Date().toString());
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 14:36:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.schedule(task, date);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
执行结果
Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 21:28:04 CST 2016 Run Time:Tue Dec 27 21:28:04 CST 2016
说明是立刻执行。
schedule(TimerTask task, long delay, long period)
以当前时间为基准,延迟指定的毫秒后,再按指定的时间间隔地无限次数的执行TimerTask任务。(fixed-delay execution)
使用示例
public class Demo {
private static Timer timer = new Timer();
public static class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("Run Time: " + new Date().toString());
}
}
public static void main(String[] args) {
MyTask task = new MyTask();
System.out.println("Now Time: " + new Date().toString());
timer.schedule(task, 3000, 5000);
}
}
执行结果
Now Time: Tue Dec 27 21:34:59 CST 2016 Run Time: Tue Dec 27 21:35:02 CST 2016 Run Time: Tue Dec 27 21:35:07 CST 2016 Run Time: Tue Dec 27 21:35:12 CST 2016 Run Time: Tue Dec 27 21:35:17 CST 2016
说明以当前基准时间延迟3秒后执行一次,以后按指定间隔时间5秒无限次数的执行。
schedule(TimerTask task, Date firstTime, long period)
在指定的日期之后,按指定的时间间隔地无限次数的执行TimerTask任务。(fixed-delay execution)
如果日期firstTime早于当前时间,则立刻执行,且不执行在时间差内的任务。
使用示例
public class Demo {
private static Timer timer = new Timer();
public static class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("Run Time:" + new Date().toString());
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 14:36:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.schedule(task, date, 3000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
执行结果
Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 21:43:30 CST 2016 Run Time:Tue Dec 27 21:43:30 CST 2016 Run Time:Tue Dec 27 21:43:33 CST 2016 Run Time:Tue Dec 27 21:43:36 CST 2016
说明指定的之间早于当前时间,则立刻执行,不会补充时间差内的任务。
scheduleAtFixedRate方法
scheduleAtFixedRate(TimerTask task, long delay, long period)
以当前时间为基准,延迟指定的毫秒后,再按指定的时间间隔周期性地无限次数的执行TimerTask任务。(fixed-rate execution)
使用示例
public class Demo {
private static Timer timer = new Timer();
public static class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("Run Time: " + new Date().toString());
}
}
public static void main(String[] args) {
MyTask task = new MyTask();
System.out.println("Now Time: " + new Date().toString());
timer.scheduleAtFixedRate(task, 3000, 5000);
}
}
执行结果
Now Time: Tue Dec 27 21:58:03 CST 2016 Run Time: Tue Dec 27 21:58:06 CST 2016 Run Time: Tue Dec 27 21:58:11 CST 2016 Run Time: Tue Dec 27 21:58:16 CST 2016 Run Time: Tue Dec 27 21:58:21 CST 2016
说明以当前基准时间延迟3秒后执行一次,以后按指定间隔时间5秒无限次数的执行。
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
在指定的日期之后,按指定的时间间隔周期性地无限次数的执行TimerTask任务。(fixed-rate execution)
如果日期firstTime早于当前时间,则立即执行,并补充性的执行在时间差内的任务。
使用示例
public class Demo {
private static Timer timer = new Timer();
public static class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("Run Time:" + new Date().toString());
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 22:02:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.scheduleAtFixedRate(task, date, 5000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
执行结果
Date = Tue Dec 27 22:02:00 CST 2016 NowTime = Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:55 CST 2016 Run Time:Tue Dec 27 22:03:00 CST 2016 Run Time:Tue Dec 27 22:03:05 CST 2016
说明指定的之间早于当前时间,则立刻执行。
在时间22:02:00--22:02:54内大约有11个5秒间隔,则优先补充性的执行在时间差内的任务,然后在22:02:55补充完毕(执行12次。ps:0-55秒区间段内首位都算上,正好触发12次),此后每隔5秒执行一次定时任务。
执行任务延时对比之 schedule 和 scheduleAtFixedRate
schedule不延时
使用示例
public class Demo {
private static Timer timer = new Timer();
private static int runCount = 0;
public static class MyTask extends TimerTask {
@Override
public void run() {
try {
System.out.println("Begin Run Time: " + new Date().toString());
Thread.sleep(3000);
System.out.println("End Run Time: " + new Date().toString());
runCount++;
if (runCount == 3) {
timer.cancel();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 14:36:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.schedule(task, date, 5000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
执行结果
早于当前基准时间
Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 22:23:37 CST 2016 Begin Run Time: Tue Dec 27 22:23:37 CST 2016 End Run Time: Tue Dec 27 22:23:40 CST 2016 Begin Run Time: Tue Dec 27 22:23:42 CST 2016 End Run Time: Tue Dec 27 22:23:45 CST 2016 Begin Run Time: Tue Dec 27 22:23:47 CST 2016 End Run Time: Tue Dec 27 22:23:50 CST 2016 Process finished with exit code 0
晚于当前基准时间
Date = Tue Dec 27 22:42:00 CST 2016 NowTime = Tue Dec 27 22:41:54 CST 2016 Begin Run Time: Tue Dec 27 22:42:00 CST 2016 End Run Time: Tue Dec 27 22:42:03 CST 2016 Begin Run Time: Tue Dec 27 22:42:05 CST 2016 End Run Time: Tue Dec 27 22:42:08 CST 2016 Begin Run Time: Tue Dec 27 22:42:10 CST 2016 End Run Time: Tue Dec 27 22:42:13 CST 2016 Process finished with exit code 0
不管早还是晚于基准时间,都不进行补偿,下一次任务的执行时间参考的是上一次任务的开始时间点来计算。
schedule延时
使用示例
public class Demo {
private static Timer timer = new Timer();
private static int runCount = 0;
public static class MyTask extends TimerTask {
@Override
public void run() {
try {
System.out.println("Begin Run Time: " + new Date().toString());
Thread.sleep(5000);
System.out.println("End Run Time: " + new Date().toString());
runCount++;
if (runCount == 3) {
timer.cancel();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 22:42:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.schedule(task, date, 3000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
执行结果
早于当前基准时间
Date = Tue Dec 27 22:42:00 CST 2016 NowTime = Tue Dec 27 22:45:17 CST 2016 Begin Run Time: Tue Dec 27 22:45:17 CST 2016 End Run Time: Tue Dec 27 22:45:22 CST 2016 Begin Run Time: Tue Dec 27 22:45:22 CST 2016 End Run Time: Tue Dec 27 22:45:27 CST 2016 Begin Run Time: Tue Dec 27 22:45:27 CST 2016 End Run Time: Tue Dec 27 22:45:32 CST 2016 Process finished with exit code 0
晚于当前基准时间
Date = Tue Dec 27 22:47:00 CST 2016 NowTime = Tue Dec 27 22:46:27 CST 2016 Begin Run Time: Tue Dec 27 22:47:00 CST 2016 End Run Time: Tue Dec 27 22:47:05 CST 2016 Begin Run Time: Tue Dec 27 22:47:05 CST 2016 End Run Time: Tue Dec 27 22:47:10 CST 2016 Begin Run Time: Tue Dec 27 22:47:10 CST 2016 End Run Time: Tue Dec 27 22:47:15 CST 2016 Process finished with exit code 0
不管早还是晚于当前基准时间,都不进行补偿,下一次任务的执行时间都是参考上一次任务结束的时间点来计算。
scheduleAtFixedRate不延时
使用示例
public class Demo {
private static Timer timer = new Timer();
private static int runCount = 0;
public static class MyTask extends TimerTask {
@Override
public void run() {
try {
System.out.println("Begin Run Time: " + new Date().toString());
Thread.sleep(3000);
System.out.println("End Run Time: " + new Date().toString());
runCount++;
if (runCount == 1000) {
timer.cancel();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 22:51:42";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.scheduleAtFixedRate(task, date, 5000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
执行结果
早于当前基准时间
Date = Tue Dec 27 22:51:42 CST 2016 NowTime = Tue Dec 27 22:51:57 CST 2016 Begin Run Time: Tue Dec 27 22:51:57 CST 2016 End Run Time: Tue Dec 27 22:52:00 CST 2016 Begin Run Time: Tue Dec 27 22:52:00 CST 2016 End Run Time: Tue Dec 27 22:52:03 CST 2016 Begin Run Time: Tue Dec 27 22:52:03 CST 2016 End Run Time: Tue Dec 27 22:52:06 CST 2016 Begin Run Time: Tue Dec 27 22:52:06 CST 2016 End Run Time: Tue Dec 27 22:52:09 CST 2016 Begin Run Time: Tue Dec 27 22:52:09 CST 2016 End Run Time: Tue Dec 27 22:52:12 CST 2016 Begin Run Time: Tue Dec 27 22:52:12 CST 2016 End Run Time: Tue Dec 27 22:52:15 CST 2016 Begin Run Time: Tue Dec 27 22:52:15 CST 2016 End Run Time: Tue Dec 27 22:52:18 CST 2016 Begin Run Time: Tue Dec 27 22:52:18 CST 2016 End Run Time: Tue Dec 27 22:52:21 CST 2016 Begin Run Time: Tue Dec 27 22:52:22 CST 2016 End Run Time: Tue Dec 27 22:52:25 CST 2016 Begin Run Time: Tue Dec 27 22:52:27 CST 2016 End Run Time: Tue Dec 27 22:52:30 CST 2016 Begin Run Time: Tue Dec 27 22:52:32 CST 2016 End Run Time: Tue Dec 27 22:52:35 CST 2016 Begin Run Time: Tue Dec 27 22:52:37 CST 2016 End Run Time: Tue Dec 27 22:52:40 CST 2016 Begin Run Time: Tue Dec 27 22:52:42 CST 2016 End Run Time: Tue Dec 27 22:52:45 CST 2016 Begin Run Time: Tue Dec 27 22:52:47 CST 2016 End Run Time: Tue Dec 27 22:52:50 CST 2016 Begin Run Time: Tue Dec 27 22:52:52 CST 2016 End Run Time: Tue Dec 27 22:52:55 CST 2016 Begin Run Time: Tue Dec 27 22:52:57 CST 2016 End Run Time: Tue Dec 27 22:53:00 CST 2016 Process finished with exit code 0
晚于当前基准时间
Date = Tue Dec 27 22:37:00 CST 2016 NowTime = Tue Dec 27 22:36:06 CST 2016 Begin Run Time: Tue Dec 27 22:37:00 CST 2016 End Run Time: Tue Dec 27 22:37:03 CST 2016 Begin Run Time: Tue Dec 27 22:37:05 CST 2016 End Run Time: Tue Dec 27 22:37:08 CST 2016 Begin Run Time: Tue Dec 27 22:37:10 CST 2016 End Run Time: Tue Dec 27 22:37:13 CST 2016 Process finished with exit code 0
不延时的情况下,当早于基准时间时,时间差内的执行任务未补偿完时,下一次执行任务的时间参考的是上一次执行任务的结束时间;一旦补偿完毕(注意粗体时间点),下一次执行任务的时间参考的是上一次执行任务的开始时间;当晚于基准时间时,下一次执行任务的时间参考的是上一次执行任务的开始时间。
scheduleAtFixedRate延时
使用示例
public class Demo {
private static Timer timer = new Timer();
private static int runCount = 0;
public static class MyTask extends TimerTask {
@Override
public void run() {
try {
System.out.println("Begin Run Time: " + new Date().toString());
Thread.sleep(5000);
System.out.println("End Run Time: " + new Date().toString());
runCount++;
if (runCount == 3) {
timer.cancel();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = "2016-12-27 22:28:00";
Date date = sdf.parse(dateStr);
System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString());
timer.scheduleAtFixedRate(task, date, 3000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
执行结果
早于当前基准时间
Date = Tue Dec 27 23:01:00 CST 2016 NowTime = Tue Dec 27 23:01:19 CST 2016 Begin Run Time: Tue Dec 27 23:01:19 CST 2016 End Run Time: Tue Dec 27 23:01:24 CST 2016 Begin Run Time: Tue Dec 27 23:01:24 CST 2016 End Run Time: Tue Dec 27 23:01:29 CST 2016 Begin Run Time: Tue Dec 27 23:01:29 CST 2016 End Run Time: Tue Dec 27 23:01:34 CST 2016 Begin Run Time: Tue Dec 27 23:01:34 CST 2016 End Run Time: Tue Dec 27 23:01:39 CST 2016
晚于当前基准时间
Date = Tue Dec 27 22:28:00 CST 2016 NowTime = Tue Dec 27 22:27:55 CST 2016 Begin Run Time: Tue Dec 27 22:28:00 CST 2016 End Run Time: Tue Dec 27 22:28:05 CST 2016 Begin Run Time: Tue Dec 27 22:28:05 CST 2016 End Run Time: Tue Dec 27 22:28:10 CST 2016 Begin Run Time: Tue Dec 27 22:28:10 CST 2016 End Run Time: Tue Dec 27 22:28:15 CST 2016 Process finished with exit code 0
延时的情况下,即使是早于基准时间,由于延时效应,根本不可能补偿完毕时间差内的执行任务,故而在延时的情况下,下一次任务的执行时间都是参考上一次任务结束的时间来计算。
对比总结
| 执行任务不延时 | 执行任务延时 | |
|---|---|---|
| 早于当前基准时间 | schedule:下一次任务的执行时间参考的是上一次任务的开始时间来计算。 scheduleAtFixedRate:当早于基准时间时,时间差内的执行任务未补偿完时,下一次执行任务的时间参考的是上一次任务的结束时间;一旦补偿完毕,下一次执行任务的时间参考上一次任务的开始时间来计算。 | 二者一样。下一次任务的执行时间都是参考上一次任务的结束时间来计算。 |
| 晚于当前基准时间 | 二者一样。下一次任务的执行时间参考的是上一次任务的开始时间来计算。 | 二者一样。下一次任务的执行时间都是参考上一次任务的结束时间来计算。 |
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# java
# 定时器
# timer
# java中Timer定时器的使用和启动方式
# Java中的定时器Timer详解
# Java线程Timer定时器用法详细总结
# Java定时器Timer使用方法详解
# Java多线程定时器Timer原理及实现
# java定时器timer的使用方法代码示例
# 深入了解Java定时器中的Timer的原理
# 的是
# 早于
# 执行时间
# 都是
# 晚于
# 时间为
# 都不
# 结束时间
# 情况下
# 再按
# 不可能
# 而在
# 即使是
# 但不
# 约有
# 首位
# 主要用于
# 每隔
# 都算
# 粗体
相关文章:
如何通过二级域名建站提升品牌影响力?
如何通过虚拟主机空间快速建站?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何选择PHP开源工具快速搭建网站?
在线教育网站制作平台,山西立德教育官网?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
宁波免费建站如何选择可靠模板与平台?
建站主机数据库如何配置才能提升网站性能?
如何在阿里云虚拟主机上快速搭建个人网站?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
建站主机如何选?高性价比方案全解析
h5网站制作工具有哪些,h5页面制作工具有哪些?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在宝塔面板创建新站点?
制作企业网站建设方案,怎样建设一个公司网站?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
PHP 500报错的快速解决方法
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
如何在万网开始建站?分步指南解析
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
建站ABC备案流程中有哪些关键注意事项?
广州美橙建站如何快速搭建多端合一网站?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
如何配置WinSCP新建站点的密钥验证步骤?
香港服务器如何优化才能显著提升网站加载速度?
如何快速生成可下载的建站源码工具?
SQL查询语句优化的实用方法总结
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
如何快速选择适合个人网站的云服务器配置?
怀化网站制作公司,怀化新生儿上户网上办理流程?
香港服务器WordPress建站指南:SEO优化与高效部署策略
制作网站的公司有哪些,做一个公司网站要多少钱?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
,网页ppt怎么弄成自己的ppt?
如何通过西部数码建站助手快速创建专业网站?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
C++时间戳转换成日期时间的步骤和示例代码
如何制作网站标识牌,动态网站如何制作(教程)?
深圳网站制作平台,深圳市做网站好的公司有哪些?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
如何用花生壳三步快速搭建专属网站?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
如何解决VPS建站LNMP环境配置常见问题?
*请认真填写需求信息,我们会在24小时内与您取得联系。