Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务。这种方式可以让程序按照某一个频度执行,但不能指定时间运行。用的较少。

任务的调用通过起的子线程进行执行。

java.util.Timer

java.util.TimerTask

一、调用方法:

(1)void java.util.Timer.schedule(TimerTask task, long delay):多长时间(毫秒)后执行任务

(2)void java.util.Timer.schedule(TimerTask task, Date time):设定某个时间执行任务

(3)void java.util.Timer.schedule(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(4)void java.util.Timer.schedule(TimerTask task, Date firstTime, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

(5)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(6)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

void java.util.Timer.cancel():终止该Timer

boolean java.util.TimerTask.cancel():终止该TimerTask

可以为每个Timer指定多个TimerTask

虽然可通过void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)方法完成“例如:每天上午10点执行一次”的业务,但该实现是基于进行一天(1000 * 60 * 60 * 24毫秒)进行延迟的机制实现的,并不是指定某个具体时间进行执行的。

对于该种需求,可通过Quartz来进行实现

二、方法名称schedule()和scheduleAtFixedRate()两者的区别

当需要根据period区间时间循环多次调用任务的时候,会存在两种不同的策略,两种方法提供了不同的策略。

调用方法(1)、(2)只是单次执行,不存在多次调用任务的情况,所以没有提供scheduleAtFixedRate方法的调用方式。

<1>schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
<2>scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period

三、示例

(1)

/**
* 第一种方法:设定多长时间(毫秒)后执行任务
*/
public static void timer1() {
final StopWatch watch = new StopWatch();
watch.start();
Timer timer = new Timer();
/* void java.util.Timer.schedule(TimerTask task, long delay) */
timer.schedule(new TimerTask() {
public void run() {
watch.stop();
System.out.println("-------任务执行--------");
System.out.println(watch.getTime());
}
}, );// delay=2000毫秒 后执行该任务
}

(2)

/**
* 第二种方法:设定某个时间执行任务
*/
public static void timer2() {
Calendar calendar = new GregorianCalendar();
calendar.add(Calendar.MINUTE, 1);
calendar.set(Calendar.SECOND, 0); // 一分钟后执行
Timer timer = new Timer();
/* void java.util.Timer.schedule(TimerTask task, Date time) */
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("-------任务执行--------");
}
}, calendar.getTime());
}

  

(3)

(4)

period:500毫秒;每次任务执行时间400毫秒;所以每次任务执行完成后到下一次任务调用开始的时间趋近于100毫秒

打印日志信息:

  1. 1000
  2. ########第1次执行开始########
  3. ########第1次执行结束########
  4. 109
  5. ########第2次执行开始########
  6. ########第2次执行结束########
  7. 93
  8. ########第3次执行开始########
  9. ########第3次执行结束########
  10. 93
  11. ########第4次执行开始########
  12. ########第4次执行结束########
  13. 93
  14. ########第5次执行开始########
  15. ########第5次执行结束########
  16. 93
  17. ########第6次执行开始########
  18. ########第6次执行结束########
  19. 93
  20. ########第7次执行开始########
  21. ########第7次执行结束########
  22. 93
  23. ########第8次执行开始########

当将Thread.sleep(400);修改为Thread.sleep(600)时:

打印日志信息:

  1. 1000
  2. ########第1次执行开始########
  3. ########第1次执行结束########
  4. 0
  5. ########第2次执行开始########
  6. ########第2次执行结束########
  7. 0
  8. ########第3次执行开始########
  9. ########第3次执行结束########
  10. 0
  11. ########第4次执行开始########
  12. ########第4次执行结束########
  13. 0
  14. ########第5次执行开始########

(5)

(6)

/**
* 第五种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。
* timer.schedule和timer.scheduleAtFixedRate的区别:
* (1)schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
* (2)scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period
*/
public static void timer5() {
Timer timer = new Timer();
/* void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period) */
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
}
}, , );
}

转:http://blog.csdn.net/eg366/article/details/11836017

java Timer 使用小结的更多相关文章

  1. Java:利用java Timer类实现定时执行任务的功能

    一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务.TimerTask一个抽象类,它的子类代 ...

  2. Java定时任务:利用java Timer类实现定时执行任务的功能

    一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务. TimerTask一个抽象类,它的子类 ...

  3. Java Timer触发定时器

    XML: <!-- Java Timer定时 --> <!-- <bean id="shortUrlTask" class=" com.sprin ...

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

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

  5. java并发包小结(二)

    接上一篇 java并发包小结(一):http://blog.csdn.net/aalansehaiyang52/article/details/8877579 Future 接口Future 接口允许 ...

  6. Java Timer

    Java Timer 定时类,主要用来执行定时任务 Timer管理所有要执行的定时任务 TimerTask封装好的定时任务 常见的用法 MyTask myTask = new MyTask(); Ti ...

  7. JAVA Timer定时器使用方法

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

  8. java Timer定时器管理类

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

  9. Java Timer TimerTask Example(java Timer的例子)

    Java java.util.Timer is a utility class that can be used to schedule a thread to be executed at cert ...

随机推荐

  1. win7系统64位plsql的设置

    1. Instant Client Downloads for Microsoft Windows (32-bit) 我下载的是: instantclient-basic-win32-11.2.0.1 ...

  2. ASP.NET MVC学习之路由篇

    约束路由 上面我们有一个{id}用来捕获参数的,但是你也发现了它可以捕捉任何字符串等等,但是我们有时需要限制它,比如让它只能输入数字,那么我们就可以使用正则表达式去约束它. 如下修改RouteConf ...

  3. 《JavaScript权威指南》读书笔记2

    3.6-3.8 这三章主要介绍了JS的包装对象.不可变的原始值和可变的对象引用.JS中的类型转换. 包装对象主要指当原始值需要调用一些方法的时候(原始值本身是不能通过"."来调用的 ...

  4. media type 与 media query

    参考博客:http://www.qianduan.net/media-type-and-media-query.html media type(媒体类型)是css 2中的一个非常有用的属性,通过med ...

  5. VLC客户端和SDK的简单应用

    VLC_SDK编程指南 VLC 是一款自由.开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD.音频 CD.VCD 及各类流媒体协议.它可以支持目前市面上大多数的视频解码,除了Rea ...

  6. Eloquent ORM 之关联查询

    小伙伴们好,本文是在我的前一篇随笔的基础上完成的,还没有浏览的同学,请移尊驾哦 Eloquent ORM学习笔记. 前一篇文章用到了leftJoin方法,其实Eloquent对于模块之间的关联查询有自 ...

  7. C#实现在winfrom程序中下载文件

    //下载文件//downlaodUrl 系统路径如:http://xxx.xxx.xxx/UpFile/kaoqin.doc//fileName 自定义文件名字加后缀(如:考勤.doc)//fileP ...

  8. HeadFirst设计模式读书笔记(3)-装饰者模式(Decorator Pattern)

    装饰者模式:动态地将责任附件到对象上.若要扩展功能,装饰者提东了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型 你可以用一个或者多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超 ...

  9. 一道C语言面试题:写一个宏,将16位的整数转为Big Endian

    题目:输入16位整数x,如0x1234,将其转为Big Endian格式再输出,此例为输出 0x3412 来源:某500强企业面试题目 思路:将x左移8位得到a,将x右移8位得到b,a+b即为所得 / ...

  10. cf459B Pashmak and Flowers

    B. Pashmak and Flowers time limit per test 1 second memory limit per test 256 megabytes input standa ...