Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。
TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。
1、添加一个任务,继承实现TimerTask
1
2
3
4
5
6
7
|
publicclassTemplateTaskextendsTimerTask{
@Override
publicvoidrun() {
// TODO Auto-generated method stub
System.out.println("正在执行我的任务");
}
}
|
2、编写任务调度策略的范围接口
1
2
3
4
5
6
7
|
publicinterfaceSchedulerService {
voidschedule(TimerTask task,longdelay);
voidschedule(TimerTask task,longdelay,longperiod);
voidschedule(TimerTask task, Date firstTime,longperiod);
voidscheduleAtFixedRate(TimerTask task,longdelay,longperiod);
voidscheduleAtFixedRate(TimerTask task, Date firstTime,longperiod);
}
|
3、实现任务策略接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
publicclassSchedulerServiceImplimplementsSchedulerService {
//延迟多长时间调用一次就陷入线程等待
@Override
publicvoidschedule(TimerTask task,longdelay) {
newTimer().schedule(task, delay);
}
//延迟delay微秒调用一次,以后每隔period微秒执行一次
@Override
publicvoidschedule(TimerTask task,longdelay,longperiod) {
newTimer().schedule(task, delay, period);
}
//从firstTime开始执行,每隔period微秒执行一次
@Override
publicvoidschedule(TimerTask task, Date firstTime,longperiod) {
newTimer().scheduleAtFixedRate(task, firstTime, period);
}
//延迟delay微秒调用一次,以后每隔period微秒执行一次:方法重在执行频率
@Override
publicvoidscheduleAtFixedRate(TimerTask task,longdelay,longperiod) {
newTimer().scheduleAtFixedRate(task, delay, period);
}
//从firstTime开始执行,每隔period微秒执行一次:方法重在执行频率
@Override
publicvoidscheduleAtFixedRate(TimerTask task, Date firstTime,longperiod) {
newTimer().scheduleAtFixedRate(task, firstTime, period);
}
}
|
注:建议使用schedule方法。
4、调度业务调用
1
2
3
4
5
6
7
8
9
10
11
|
publicstaticvoidmain(String[] args) {
SchedulerService service=newSchedulerServiceImpl();
// execute one time then the thread turn to wait status
service.schedule(newTemplateTask(),5*1000);
// start from now every 5 seconds execute my task
// service.schedule(new TemplateTask(), new Date(), 5*1000);
//delay 5 seconds then as 5 seconds time-step to execute my task
// service.schedule(new TemplateTask(), 5*1000, 5*1000);
// service.scheduleAtFixedRate(new TemplateTask(), new Date(), 5*1000);
// service.scheduleAtFixedRate(new TemplateTask(), 5*1000, 5*1000);
}
|
5、一个完整的小示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
packagecom.boonya.quartz;
importjava.util.Date;
importorg.quartz.Job;
importorg.quartz.JobDetail;
importorg.quartz.JobExecutionContext;
importorg.quartz.JobExecutionException;
importorg.quartz.Scheduler;
importorg.quartz.SchedulerException;
importorg.quartz.SchedulerFactory;
importorg.quartz.SimpleTrigger;
importorg.quartz.Trigger;
importorg.quartz.impl.StdSchedulerFactory;
/**
* Description:最简单的一个定时任务[如果使用web程序框架可以实现任务的动态调用:如spring(Spring MVC)的依赖注入功能]
* @author boonya
* @version 1.0
*/
publicclassHelloWorldimplementsJob {
@Override
publicvoidexecute(JobExecutionContext context)
throwsJobExecutionException {
System.out.println("Hello World : "+newDate());
}
publicstaticvoidmain(String[] args)throwsSchedulerException {
// 从工厂中返回一个scheduler实例
SchedulerFactory schedulerFactory =newSchedulerFactoryImpl();
Scheduler scheduler = schedulerFactory.getScheduler();
//实例化一个具体任务
JobDetail jobDetail =newJobDetail("helloWorldJobDetail",
"helloWorldGroup", HelloWorld.class);
//为这个任务添加触发器
Trigger trigger =newSimpleTrigger("helloWorldTrigger",
"helloWorldGroup",newDate(System.currentTimeMillis() +3000),
null,5,1*1000);/* 第一个是Trigger的名称,第二个是Trigger的组名,第三个是任务开始时间,第四个是结束时间,第五个是重复次数
* (使用SimpleTrigger.REPEAT_INDEFINITELY常量可表示无限次),最后一个是重复周期(单位是毫秒)。
* 这里意义:开始3秒后执行一次 ,之后每1秒执行一次,执行5次。*/
//将具体任务和触发器部署到调度器scheduler上,可部署多个job及触发器
scheduler.scheduleJob(jobDetail, trigger);
// 启动调度器,开始执行时间计划
scheduler.start();
}
}
|
- 每一个Timer仅对应唯一一个线程。
- Timer不保证任务执行的十分精确。
- Timer存在线程安全隐患。