前言:Java定时器目前主要有3种实现方式:JDK组件,Spring Task,Quartz框架。
1. JDK组件
(1) java.util.TimerTask
MyTimerTask.java:
public class MyTimerTask extendsTimerTask {
@Overridepublic voidrun() {
System.out.println(“MyTimerTask, now: ” + new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(newDate()));
}public static voidmain(String[] args) {
Timer timer= newTimer();
timer.schedule(new MyTimerTask(), 1000, 1000);//timer.cancel();//停止调度器}
}
(2) java.util.concurrent.ScheduledThreadPoolExecutor(JDK5.0+之后推荐使用)
MyScheduledTask.java:
public class MyScheduledTask implementsRunnable {public voidrun() {
System.out.println(“my scheduled task, now: ” + new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(newDate()));
}
}
MyScheduledExecutor.java:
public classMyScheduledExecutor {public static voidmain(String[] args) {
ScheduledThreadPoolExecutor executor= new ScheduledThreadPoolExecutor(10);
ScheduledFuture future= executor.scheduleWithFixedDelay(new MyScheduledTask(), 1000, 1000, TimeUnit.MILLISECONDS);//future.cancel(true);//停止定时任务,Timer不能停止定时任务,只能关闭调度器//executor.shutdown();//关闭调度器
}
}
比较:java.util.concurrent.ScheduledThreadPoolExecutor比java.util.Timer更加灵活和高效。
2. Spring Task
(1) xml配置方式实现
TaskJob.java:
@Servicepublic classTaskJob {public voidjob1() {
System.out.println(“指定Spring定时任务1, now: ” + new SimpleDateFormat(“yyy-MM-dd HH:mm:ss”).format(newDate()));
}
}
spring.xml:
xsi:schemaLocation=”
…
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd”>
(2) 注解方式实现
TaskJob2.java:
@Componentpublic classTaskJob2 {/*** 每隔一秒执行一次*/@Scheduled(cron=”0/1 * * * * ?”)public voidjob2() {
System.out.println(“注解方式使用spring定时任务框架, now: ” + new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(newDate()));
}
}
spring.xml:
xsi:schemaLocation=”
…
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd”>
(1) 独立使用Quartz(详见Quartz官方示例):
pom.xml:
org.quartz-scheduler
quartz
2.2.1
org.quartz-scheduler
quartz-jobs
2.2.1
定义定时任务,MyJob.java:
public class MyJob implementsJob {public void execute(JobExecutionContext arg0) throwsJobExecutionException {
System.out.println(“执行Quartz定时任务实现, now: ” + new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”).format(newDate()));
}
}
调度定时任务,MyJobSheduler:
public classMyJobSheduler {public static voidmain(String[] args) {try{
JobDetail job= JobBuilder.newJob(MyJob.class).withIdentity(“myJob”).build();
Trigger trigger=TriggerBuilder.newTrigger().withIdentity(“trigger1”, “group1”)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
.build();
Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(job, trigger);
scheduler.start();
}catch(SchedulerException e) {
e.printStackTrace();
}
}
}
【实现比较】
实现方式
优点
缺点
JDK组件
无需引入第三方依赖,控制灵活
仅支持简单任务调度,不支持指定日期等复杂定时任务
SpringTask
功能相对JDK方式全面(简单或指定日期等复杂任务调度),支持注解和配置2种方式
Quartz
开源,功能全面且强大(简单或指定日期等复杂任务调度),可独立使用,也可以与Spring集成 必须在项目中引入quartz依赖
在项目中必须引入quartz依赖
【使用总结】
1. J2EE项目
— 未依赖Spring框架,建议使用Quartz。
— 引入了Spring 3.x+,如果仅需要简单定时任务控制,建议使用Spring Task;否则建议使用Quartz。
— 特别地,在Spring Boot项目中,根据需求可以灵活选择JDK,Spring Task或者Quartz。
2. 非J2EE项目
— 简单定时任务控制,建议使用JDK实现:java.util.concurrent.ScheduledThreadPoolExecutor;否则建议使用Quartz。
附:在Linux环境下,可以直接使用crontab程序实现简单的定时任务,比如定时全量备份MySQL数据库。