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
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;4、schedule与scheduleAtFixedRate区别
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();
}
}
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 去执行即可。