在SpringBoot中,有四种方式来使用定时任务:
Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
Spring Task:Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
Quartz:这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
我们今天来运行学习一下知乎上说的这四种定时器,不,先学前两种JDK自带的:
一、Timer
packagecom.xing.studyboot.time; importjava.time.LocalDateTime; importjava.util.Timer; importjava.util.TimerTask; importjava.util.concurrent.Executors; importjava.util.concurrent.TimeUnit; /*** util包的定时,支持* @author xing* @createTime*/publicclassTestTimer { publicstaticvoidmain(String[] args) { //一、JDK自带的timer java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。//新建一个任务操作TimerTasktimerTask=newTimerTask() { publicvoidrun() { System.out.println("执行。。。"+LocalDateTime.now()); } }; Timertimer=newTimer(); //安排指定的任务在指定的时间开始进行重复的固定延迟执行。这里10毫秒后开始执行,每3秒执行一次timer.schedule(timerTask,10,3000); }
二、ScheduledExecutorService
packagecom.xing.studyboot.time; importjava.util.Date; importjava.util.Timer; importjava.util.TimerTask; importjava.util.concurrent.Executors; importjava.util.concurrent.ScheduledExecutorService; importjava.util.concurrent.TimeUnit; /*** util包的定时,支持* @author xing* @createTime*/publicclassTestTimer { publicstaticvoidmain(String[] args) { //二、ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。ScheduledExecutorServiceservice=Executors.newSingleThreadScheduledExecutor(); // 参数:1、任务体 2、首次执行的延时时间 3、任务执行间隔 4、间隔时间单位service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+newDate()), 0, 3, TimeUnit.SECONDS); } }
ScheduledExecutorService 和Timer都是JDK自带的定时器,不过Timer功能比较单一哈,只能在当前时间的x秒后开始并间隔y秒不停的执行。比如间隔是3秒,但是上一次的任务却还没执行完,可能会影响下一个任务,所以可以使用ScheduledExecutorService ,因为不同于Timer,他是分配给不同的线程并发运行,互不影响的。
图片
总结:
JDK自带的两种定时器,只支持按照相同时间间隔反复执行。
Timer属于单线程同步执行.
ScheduledExecutorService属于多线程并发执行.
下节学SpringTask和Quartz!
END