概述

主要用于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:当早于基准时间时,时间差内的执行任务未补偿完时,下一次执行任务的时间参考的是上一次任务的结束时间;一旦补偿完毕,下一次执行任务的时间参考上一次任务的开始时间来计算。 二者一样。下一次任务的执行时间都是参考上一次任务的结束时间来计算。
晚于当前基准时间 二者一样。下一次任务的执行时间参考的是上一次任务的开始时间来计算。 二者一样。下一次任务的执行时间都是参考上一次任务的结束时间来计算。

注意:scheduleAtFixedRate示例中firstTime是有区别的,而结果证明是有补偿性操作的。


(END)

Java定时器Timer简述的更多相关文章

  1. Java定时器Timer

    Java定时器Timer在JDK库中,Timer类主要负责计划任务的功能,也就是在指定的时开始执行某一个任务.Timer类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类,执行计划任 ...

  2. Java定时器Timer,TimerTask每隔一段时间随机生成数字

    1:java.util.Timer类是一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行. 2:TimerTask类是由 Timer 安排为一次执行或重复执行的任务 ...

  3. java定时器Timer的使用

    Time类主要负责完成定时计划任务的功能,就是在指定的时间的开始执行某个任务. Timer类的作用是设置计划任务,而封装任务内容的类是TimerTask类.此类是一个抽象类,继承需要实现一个run方法 ...

  4. Java 定时器 Timer 的使用.

    一.概念       定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的.在JDK中Timer类主要负责计划任务的功能, ...

  5. Java定时器Timer的使用详解

     转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6374714.html 定时器在Web开发中使用得不是很多.这里主要列举一下使用定时器的步骤,方便日后使用时查 ...

  6. Java定时器Timer使用方法详解

    感谢大佬:https://www.jb51.net/article/129808.htm 一.概念 定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和 ...

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

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

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

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

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

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

随机推荐

  1. [翻译]在Django项目中添加谷歌统计(Google Analytics)

    原文:<Google Analytics tracking code into Django projects, the easy way> 对我来说,制作一个可扩展的Django应用随时 ...

  2. Spring IOC 之个性化定制the nature of a bean

    1.生命周期回调 为了影响容器管理的bean的生命周期,你可以实现Spring的InitializingBean和DisposableBean接口.容器首先调用afterPropertiesSet() ...

  3. CSS知识点:font小细节

    font是用来设置网页字体属性的关键字,使用频率非常高,大家也比较熟悉.它有两种写法,一种是简写,一种分开写. 简写--font:italic bold 12px/20px arial,sans-se ...

  4. Linux 下 Vi 配置文件 .vimrc 文件

    Linux 下 Vi 配置文件 .vimrc 文件 配置 vim 的方法是在用户主目录下建立个.vimrc文件,我一般使用root帐户,所以就在/root/下建立一个.vimrc文件:vi /root ...

  5. 构建日均千万PV Web站点1

    如何构建日均千万PV Web站点 (一) 其实大多数互联网网站起初的网站架构都是(Linux+Apache+MySQL+PHP). 不过随着时代的发展,科技的进步.互联网进入寻常百姓家的生活.所谓的用 ...

  6. XLink and XPoint

    XLink 定义在 XML 文档中创建超级链接的标准方法. XPointer 允许这些超级链接指向 XML 文档中的更多具体部分(片断). XLink XLink 是 XML 链接语言(XML Lin ...

  7. iOS基础 - 单元测试

    单元测试(unit testing):对软件中最小可测试单元进行检查和验证.一般面向过程的语言中,基本单元为函数,面向对象的语言中,基本单元通常是类,其实对于一个手机上的app来说基本单元也可以是一个 ...

  8. c# in deep 之委托

    通俗来讲,委托就是吩咐别人去做某件事,但不知道他具体会怎么做.使用委托必须注意的一个问题是内存泄露问题:假如委托实例本身不能被回收,委托实例会阻止他的目标被作为垃圾回收.尤其是假如某“短命”的对象调用 ...

  9. 基本功能的shell

    手把手教你编写一个具有基本功能的shell(已开源) 刚接触Linux时,对shell总有种神秘感:在对shell的工作原理有所了解之后,便尝试着动手写一个shell.下面是一个从最简单的情况开始,一 ...

  10. Linux下获取硬盘使用情况

    Linux下获取硬盘使用情况[总结] 1.前言 在嵌入式设备中,硬盘空间非常有限,在涉及到经常写日志的进程时候,需要考虑日志的大小和删除,不然很快就硬盘写满,导致日志程序崩溃.为了捕获硬盘写满的异常场 ...