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存在线程安全隐患。