package com.ssh.quartz;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class TaskTest {
public static void main(String[] args)throws Exception {
// testTimer();
// testSchedule();
testQuartz();
}
public static void testTimer() {
Timer t = new Timer();
t.scheduleAtFixedRate(new Task(), 0, 1000 * 2);
}
public static void testSchedule() {
ScheduledExecutorService execService = Executors
.newScheduledThreadPool(3);
execService.scheduleAtFixedRate(new ScheduleTask(), 0, 2,
TimeUnit.SECONDS);
}
public static void testQuartz() throws Exception {
SchedulerFactory schedFact = new StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();
JobDetail job = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob", "group1")
.usingJobData("jobSays", "hello world!")
.usingJobData("myFloatValue", 3.141f).build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))
.build();
sched.scheduleJob(job, trigger);
}
}
class ScheduleTask implements Runnable {
public void run() {
System.out.println("test shedule");
}
}
class Task extends TimerTask {
@Override
public void run() {
System.out.println("test timer");
}
}
package com.ssh.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloJob implements Job{
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("test quartz");
}
}
三者的区别:
Timer是单线程的,如果其中一个任务报错了,那么所有的任务都将失败,且是不可恢复的。
ScheduledExecutorService是一个线程池在跑所有的任务,如果一个任务报错了,不会影响到其他的任务。但这个报错的任务是无法恢复的。
quartz:也是多线程在跑所有的任务,每个任务的报错都不会影响到其他的任务,并且这个报错的任务是自动可恢复的。