Java中Timer的用法
2015-12-28 11:20
591 查看
现在项目中用到需要定时去检查文件是否更新的功能。timer正好用于此处。
用法很简单,new一个timer,然后写一个timertask的子类即可。
这样,就可以在1秒钟之后开始执行mytask,每两秒钟执行一次。
当然,timer的功能也可以通过自己构造线程,然后在线程中用sleep来模拟停止一段时间,然后再执行某个动作。
其实,看一下timertask的源码就立即可以知道,timertask就是实现了runnable接口的。也就是说,通过timer来间隔一段时间执行一个操作,也是通过一个线程来做到的。
(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来进行实现
调用方法(1)、(2)只是单次执行,不存在多次调用任务的情况,所以没有提供scheduleAtFixedRate方法的调用方式。
<1>schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
<2>scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period
用法很简单,new一个timer,然后写一个timertask的子类即可。
package comz.autoupdatefile; import java.util.Timer; import java.util.TimerTask; public class M { public static void main(String[] args) { // TODO todo.generated by zoer Timer timer = new Timer(); timer.schedule(new MyTask(), 1000, 2000); } } class MyTask extends TimerTask { @Override public void run() { System.out.println("dddd"); } }
这样,就可以在1秒钟之后开始执行mytask,每两秒钟执行一次。
当然,timer的功能也可以通过自己构造线程,然后在线程中用sleep来模拟停止一段时间,然后再执行某个动作。
其实,看一下timertask的源码就立即可以知道,timertask就是实现了runnable接口的。也就是说,通过timer来间隔一段时间执行一个操作,也是通过一个线程来做到的。
一、调用方法:
(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
相关文章推荐
- JavaScrip——练习(做悬浮框再进一步:悬浮窗后缀悬浮窗——用this.className)
- java集合分类
- SpringDateJpa 注解 Column属性 详解
- Java动态代理一——动态类Proxy的使用
- java保留两位小数几种方法
- 深入理解Java:注解(Annotation)自定义注解入门
- Java动态代理二——CGLIB动态代理应用
- java操作mongdb多条件复合查询(包括模糊查询和按时间段查询),分页
- 如何成为一个牛掰的Java大神
- 轻量级JavaEE企业应用实战(十七)
- Java线程外篇:线程本地变量ThreadLocal
- Java 泛型通配符?解惑
- Java线程篇(十一):Fork/Join-Java并行计算框架
- Java线程篇(十):Compare And Swap
- java下使用kaptcha生成验证码
- Java线程篇(九):Condition-线程通信更高效的方式
- 严重: Context initialization failed java.lang.IllegalArgumentException at org.springframework.asm.Cla
- java实现jdbc查询结果集result转换成对应list集合
- struts2 拦截器和actioninvocation
- java读取图像的rpg以及灰度值,可以对rgb进行修改后输出新图像