定时器通常使用于数据监控,认证周期外包的项目卖给客户(按年收费)等等…
Timer
java.util包中提供的定时器
//指定延迟时间后执行
public void timerMethod(){
//创建一个定时器对象
Timer timer = new Timer();
//创建定时器要执行的任务
TimerTask task = new TimerTask() {
@Override
public void run() {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateTime = df.format(new Date());
System.out.println(dateTime);
}
};
//指定定时器要做的任务及开始时间 参数一:任务 参数二:延迟时间 参数三:执行周期
timer.schedule(task, 3000,1000);
}
quartz
由第三方提供的定时器
1、创建一个SchedulerFactory对象用于生产Scheduler对象 : Scheduler
2、创建调度所需要的任务 : JobDetail
3、指定开始的时间和执行周期 :Trigger
/**
* 在Trigger的子接口SimpleTrigger中提供了一个方法叫getRepeatCount()用于获取设置的重复次数
*/
public class Task implements Job{
static int count = 0;
@Override
/**
* 调用任务
* context中包含了定时器中所有的对象
*/
public void execute(JobExecutionContext context) throws JobExecutionException {
count++;
System.out.println("1s执行一次 ");
}
}
public static void main(String[] args) throws SchedulerException {
//创建任务调度对象
SchedulerFactory schedFact = new StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
sched.start();
//创建调度任务---Job
JobDetail jd = JobBuilder.newJob(Task.class)
//给任务一个唯一标识 参数二代表任务所在的组 参数一代表该任务的名称
.withIdentity("task01", "task")
.build();
//指定任务的执行时间及周期
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger01", "task")
//开始执行的时间 startNow立即执行 startAt(Date)指定时间执行
.withSchedule(
//SimpleSchedule可以允许用户自定义执行周期
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)
//.repeatForever())
.withRepeatCount(3))
.build();
//将任务与对应的执行周期进行关联
sched.scheduleJob(jd, trigger);
try {
Thread.sleep(5000);
System.out.println(Task.count);
if(trigger.getRepeatCount() == (Task.count-1)) {
sched.shutdown(true);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Timer和Quartz的区别
1、Timer是java.util包自带的定时器,quartz是一个第三方提供的定时器
2、Timer的任务是通过创建TimerTask子类进行实现,quartz则必须要新建一个class文件实现Job接口重写execute方法定义任务
3、Timer只能控制执行的周期及开始时间,而quartz可以灵活、准确的控制日期节点以及执行次数