java定时任务及spring框架对Timer的封装
一.Timer类
1.原子性,线程安全。
2.一个timer对象执行多个任务时使用的是同一个线程,有多个任务时会顺序执行,这样我们的延迟时间和循环时 间就会出现问题。
package com.gongshang;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TestTimer {
public static void main(String[] args) {
//创建timer对象,原子性,多任务执行时,线程等待
//一个timer对象执行多个任务时使用的是同一个线程
Timer timer = new Timer();
//参数1:timerTask对象,定时任务对象
//参数2:任务什么时候启动
//参数3:执行任务的时间间隔
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"定时任务1");
}
},new Date(),1000);
timer.schedule(new TimerTask() {
//定时任务
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"定时任务2");
}
},new Date(),1000);
System.out.println(Thread.currentThread().getName()+"主线程输出");
}
}
注意:测试时不能用@Test 因为Junit主线程执行完了会强制杀死子线程,定时任务进程也就没法执行了。
二.SpringBoot的封装
package com.gongshang.wulian1;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class MyTask {
@Scheduled(cron = "* * * * * ?")
public void task1(){
System.out.println(Thread.currentThread().getName()+"任务1");
}
@Scheduled(cron = "* * * * * ?")
public void task2(){
System.out.println(Thread.currentThread().getName()+"###任务2");
}
}
三.ScheduledExecutorService与Timer的区别
ScheduledExecutorService是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。