为什么需要定时任务
生活中定时任务的需求越来越多,场景也越来越多
如何实现定时任务
- Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少,这篇文章将不做详细介绍。
- 使用线程池来实现定时
- Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,稍后会介绍。
两种方法的实现例子
- timer类
public class MyTimer {
public static void main(String[] args) {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
LocalDateTime current = LocalDateTime.now();
String timeString = current.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("task run:"+ timeString);
}
};
Timer timer = new Timer();
//定时任务3秒后启动,每1秒执行一次
timer.schedule(timerTask,3000,1000);
}
}
- 线程池
@Component
public class TimeService {
public final static long ONE_Minute = 60 * 1000;
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
@Scheduled(fixedDelay=ONE_Minute)
public void fixedDelayJob(){
System.out.println(format.format(new Date())+" >>fixedDelay执行....");
}
@Scheduled(fixedRate=ONE_Minute)
public void fixedRateJob(){
System.out.println(format.format(new Date())+" >>fixedRate执行....");
}
@Scheduled(cron="0 15 3 * * ?")
public void cronJob(){
System.out.println(format.format(new Date())+" >>cron执行....");
}
}
public class ScheduledExecutorServiceDemo {
public static void main(String[] args) {
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
LocalDateTime current = LocalDateTime.now();
// 参数:1、任务体 2、首次执行的延时时间
// 3、任务执行间隔 4、间隔时间单位
service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+current.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))), 3, 1, TimeUnit.SECONDS);
}
}
源码
https://github.com/heiyeziran/JPA/tree/master/schedulertask/src/main/java/com/example/demo/task