定时任务,顾明思议就是在不须要人工干预的前提下,预先设定好程序执行频率或者执行时间。与传统的触发式请求响应最大的区别在于,定时任务须要在程序设计时自动进行响应调用。java
经常使用的几种定时任务实现方式以下:spring
1.Timer:一种java自带的java.util.Timer类,改类调度一个java.util.TimerTask任务,使用该方法会让程序以必定的频率去执行,可是不能指定时间下运行。该种方法在我最开始接触java编程语言的时候使用过,目前已经基本被我废弃,废话很少说了,直接上demo代码。编程
public class TestTimer { public static void main(String[] args) { TimerTask timerTask = new TimerTask() { @Override public void run() { System.out.println("task run:"+ new Date()); } }; Timer timer = new Timer(); //安排指定的任务在指定的时间开始进行重复的固定延迟执行。这里是每3秒执行一次 timer.schedule(timerTask,10,3000); }
2.ScheduledExecutorService:改类是基于线程池设计的定时任务类,每一个调度任务分配到线程池中的一个线程去执行,能够并发执行。api
public class TestScheduledExecutorService { public static void main(String[] args) { ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); // 参数:一、任务体 二、首次执行的延时时间 // 三、任务执行间隔 四、间隔时间单位 service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS); }
3.今年开始我慢慢地喜欢上了注解的方式,再加上使用过了spring boot框架以后,愈加以为能用注解解决的问题就用注解解决,这是由于它真心方便。这一种方式是我极力推崇的,也是我在目前项目中常常使用的用于定时任务处理的方法。先上代码再说。并发
public class ScheduledService { @Scheduled(fixedDelay = 60000) //1分钟执行一次 public void serviceStatusGet(){ log.info(String.format("===第%s次开始执行应用状态数据抽取服务,当前时间为:%s", count2, dateFormat.format(new Date()))); svcStatusUtil.getServiceStatus(); log.info(String.format("===第%s次执行结束应用状态数据抽取服务,当前时间为:%s", count2, dateFormat.format(new Date()))); count2++; } @Scheduled(cron = "0 0 12 * * ?") //天天中午12点触发 public void serviceStatusGet2(){ log.info(String.format("===第%s次开始执行应用状态数据抽取服务,当前时间为:%s", count2, dateFormat.format(new Date()))); svcStatusUtil.getServiceStatus(); log.info(String.format("===第%s次执行结束应用状态数据抽取服务,当前时间为:%s", count2, dateFormat.format(new Date()))); count2++; } }
该定时任务很是简易,只须要在要实现的方法上添加@Scheduled(*)注解便可,经常使用的能够分为两类,第一种属于按照时间频率定时任务@Scheduled(fixedDelay=6000),另外一种为设置固定时间点执行定时任务@Scheduled(“0 0 12 * * ?” )。具体的其它类型能够想看对应的api。总之,在使用过上面几种定时任务处理的经验来看,直接使用@@Scheduled注解的方式应该是最方便的。框架