java定时器Timer的使用
2016-09-02 16:31
369 查看
1、构造方法
①Timer timer = new Timer();
②定时器为守护进程
boolean flag=true;
Timer timer1 =new Timer(flag);
③指定定时器的名字,方便指定停止
String name="TimerName2";
Timer timer2 =new Timer(name);
④指定定时器的名字,并指定为守护进程
String name3="TimerName3";
Timer timer3 =new Timer(name3, flag);
2、方法
①延时delay时间后执行task
②指定时间执行task
③period:间隔周期 delay:执行延时周期 开始delay时间后间隔period执行task
④间隔period时间,在指定firstTime时间执行
⑤period:间隔周期 delay:执行延时周期 开始delay时间后间隔period执行task
⑥间隔period时间,在指定firstTime时间执行
public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
⑦定时器停止运行
⑧从这个计时器的任务队列中移除所有已取消的任务。
3、example
上面例子间隔时间是3分钟,指定开始时间是2006/09/02 14:10:00,如果我在14:17:00分执行这个程序,会立刻打印3次
this is task you do6 //14:10
this is task you do6 //14:13
this is task you do6 //14:16
如果用schedule方法,相同参数条件下,在14:17:00执行,则立即执行一次,且下次的执行时间是14:20:00,而不是14:19:00
需要注意:scheduleAtFixedRate和schedule在参数完全相同的情况下,执行效果不同。上面是简单的例子,在实际的项目中,定时任务比较复杂,由于某种原因(如垃圾回
收或者其他后台活动)延迟了某次的执行,则scheduleAtFixedRate方法将快速连续的出现两次或更多的执行,从而使后续执行能力追赶上来;而schedule方法的后续执行也
将被延迟。所以,在长期的运行中,scheduleAtFixedRate执行的频率将整好是指定周期的倒数,schedule执行的频率一般要稍慢于指定周期倒数。
结论:scheduleAtFixedRate 效率总体上高于schedule
4、总结
Timer 的优点:简单易用
Timer 的缺点:
①. Timer是基于绝对时间的。容易受系统时钟的影响。
②. 单线程。所有TimeTask可能会相关影响
③. Timer不会捕获TimerTask的异常,只是简单地停止。这样势必会影响其他TimeTask的执行。
Timer 实现任务调度的核心类:Timer 和 TimerTask。 Timer 负责设定 TimerTask 的起始与间隔执行时间。
Timer 的设计核心: TaskList 、TaskThread。Timer 将接收到的任务丢到自己的 TaskList 中,TaskList 按照 Task 的最初执行时间进行排序。TimerThread 在创建Timer时会启动成为一个守护线程。这个线程会轮询所有任务,找到一个最近要执行的任务,然后休眠,当到达最近要执行任务的开始时间点,TimerThread
被唤醒并执行该任务。之后 TimerThread 更新最近一个要执行的任务,继续休眠。
Timer 使用:使用者只需要创建一个 TimerTask 的继承类,实现自己的 run 方法,然后将其丢给 Timer 去执行即可。
①Timer timer = new Timer();
②定时器为守护进程
boolean flag=true;
Timer timer1 =new Timer(flag);
③指定定时器的名字,方便指定停止
String name="TimerName2";
Timer timer2 =new Timer(name);
④指定定时器的名字,并指定为守护进程
String name3="TimerName3";
Timer timer3 =new Timer(name3, flag);
2、方法
①延时delay时间后执行task
public void schedule(TimerTask task,long delay)
②指定时间执行task
public void schedule(TimerTask task,Date time)
③period:间隔周期 delay:执行延时周期 开始delay时间后间隔period执行task
public void schedule(TimerTask task, long delay,long period)
④间隔period时间,在指定firstTime时间执行
public void schedule(TimerTask task,Date firstTime,long period)
⑤period:间隔周期 delay:执行延时周期 开始delay时间后间隔period执行task
public void scheduleAtFixedRate(TimerTask task,long delay,long period)
⑥间隔period时间,在指定firstTime时间执行
public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
⑦定时器停止运行
public void cancel()
⑧从这个计时器的任务队列中移除所有已取消的任务。
public int purge()
3、example
package com.assp.admin.web.controller; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class JobTestController extends TimerTask { String jobName = ""; public JobTestController(String jobName) { this.jobName = jobName; } @Override public void run() { System.out.println("go::::" + jobName); } public static void main(String[] args) { Date t=new Date(); long tl=t.getTime(); Timer timer = new Timer(); boolean flag=true; Timer timer1 =new Timer(flag); String name="TimerName2"; Timer timer2 =new Timer(name); String name3="TimerName3"; Timer timer3 =new Timer(name3, flag); long delay1 = 1 * 1000; long period1 = 1000; // period1:间隔周期 delay1:执行延时周期 //从现在开始 1 秒钟之后,每隔 1 秒钟执行一次 job1 timer.schedule(new JobTestController("job1"), delay1, period1); long delay2 = 2 * 1000; long period2 = 2000; // 从现在开始 2 秒钟之后,每隔 2 秒钟执行一次 job2 timer.schedule(new JobTestController("job2"), delay2, period2); timer1.schedule(new JobTestController("timer1"), delay2, period2); //timer2.schedule(new JobTestController("timer2"), delay2, period2); //timer3.schedule(new JobTestController("timer3"), delay2, period2); timer1.cancel(); } }4、schedule与scheduleAtFixedRate区别
public static void main(String[] args) { Timer timer = new Timer(); SimpleDateFormat fTime = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date d1 = null; try { d1 = fTime.parse("2016/09/02 17:12:00"); } catch (ParseException e) { e.printStackTrace(); } timer.scheduleAtFixedRate(new TimerTask() { public void run() { System.out.println("this is task you do6"); } }, d1, 3 * 60 * 1000); }
上面例子间隔时间是3分钟,指定开始时间是2006/09/02 14:10:00,如果我在14:17:00分执行这个程序,会立刻打印3次
this is task you do6 //14:10
this is task you do6 //14:13
this is task you do6 //14:16
如果用schedule方法,相同参数条件下,在14:17:00执行,则立即执行一次,且下次的执行时间是14:20:00,而不是14:19:00
需要注意:scheduleAtFixedRate和schedule在参数完全相同的情况下,执行效果不同。上面是简单的例子,在实际的项目中,定时任务比较复杂,由于某种原因(如垃圾回
收或者其他后台活动)延迟了某次的执行,则scheduleAtFixedRate方法将快速连续的出现两次或更多的执行,从而使后续执行能力追赶上来;而schedule方法的后续执行也
将被延迟。所以,在长期的运行中,scheduleAtFixedRate执行的频率将整好是指定周期的倒数,schedule执行的频率一般要稍慢于指定周期倒数。
结论:scheduleAtFixedRate 效率总体上高于schedule
4、总结
Timer 的优点:简单易用
Timer 的缺点:
①. Timer是基于绝对时间的。容易受系统时钟的影响。
②. 单线程。所有TimeTask可能会相关影响
③. Timer不会捕获TimerTask的异常,只是简单地停止。这样势必会影响其他TimeTask的执行。
Timer 实现任务调度的核心类:Timer 和 TimerTask。 Timer 负责设定 TimerTask 的起始与间隔执行时间。
Timer 的设计核心: TaskList 、TaskThread。Timer 将接收到的任务丢到自己的 TaskList 中,TaskList 按照 Task 的最初执行时间进行排序。TimerThread 在创建Timer时会启动成为一个守护线程。这个线程会轮询所有任务,找到一个最近要执行的任务,然后休眠,当到达最近要执行任务的开始时间点,TimerThread
被唤醒并执行该任务。之后 TimerThread 更新最近一个要执行的任务,继续休眠。
Timer 使用:使用者只需要创建一个 TimerTask 的继承类,实现自己的 run 方法,然后将其丢给 Timer 去执行即可。
相关文章推荐
- java定时器的使用(Timer)
- java定时器的使用(Timer)
- java定时器的使用(Timer)
- java定时器的使用(Timer)
- Java定时器Timer使用方法详解
- Java定时器Timer和TimerTask的使用
- Java定时器的使用(Timer)
- JAVA定时器Timer的使用
- java定时器的使用(Timer)
- Java定时器的使用(Timer简介)
- java定时器的使用(Timer)
- Java定时器Timer的使用详解
- Java定时器Timer使用
- 在 ASP.NET 中使用计时器(Timer)
- 还有更好的写法吗(使用Timer来判断鼠标在控件上停留的时间)
- Spring Framework 开发参考手册 之十八 使用Quartz或Timer完成时序调度工作
- Timer使用实例
- java.util.Timer的使用实例
- 为使用JDK5.0的Timer.purge(),升级RedHat Linux 6.0上的glibc
- 正确的选择使用.NET中的三个Timer