Skip to main content

定时任务

David LiuAbout 2 min

定时任务

单体定时任务

Thread

new Thread(() -> {
    while (true) {
        try {
            System.out.println("doSameThing");
            Thread.sleep(1000 * 60 * 5);
        } catch (Exception e) {
            log.error(e);
        }
    }
}).start();

Timer

Timer timer = new Timer();
timer.schedule(() -> {
    System.out.println("doSomething");
}, 2000, 1000);

ScheduledExecutorService

可以做定时操作

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
scheduledExecutorService.scheduleAtFixedRate(() -> {
    System.out.println("doSomething");
}, 1000, 1000, TimeUnit.MILLISECONDS);

ScheduledExecutorService 是 JDK1.5+版本引进的定时任务,该类位于 java.util.concurrent 并发包下。

ScheduledExecutorService 是基于多线程的,设计的初衷是为了解决 Timer 单线程执行,多个任务之间会互相影响的问题。

它主要包含 4 个方法:

  • schedule(Runnable command,long delay,TimeUnit unit) ,带延迟时间的调度,只执行一次,调度之后可通过 Future.get()阻塞直至任务执行完毕。
  • schedule(Callable<V> callable,long delay,TimeUnit unit) ,带延迟时间的调度,只执行一次,调度之后可通过 Future.get()阻塞直至任务执行完毕,并且可以获取执行结果。
  • scheduleAtFixedRate ,表示以固定频率执行的任务,如果当前任务耗时较多,超过定时周期 period,则当前任务结束后会立即执行。
  • scheduleWithFixedDelay ,表示以固定延时执行任务,延时是相对当前任务结束为起点计算开始时间。

Spring Task

支持cron 表达式

定时任务的需求所谓是数不胜数,其中实现方式也是百花齐放,用得最多的大概率为 Springboot 中的 @Scheduled(cron = “0 0 1 1 * ?”) 注解,或者是定时任务 XXL-JOB 框架,这两者我接触的比较多,除此之外还有,Quartz 、elastic-job、但这两个在分布式领域而言,和 XXL-JOBB 比较,XXL-JOB 更为受欢迎。无论是这些框架或者是 springboot 自带的定时任务组件,基本上都能满足固定定时任务的需求。

分布式定时任务

xxl-job

elastic-job

动态定时任务

MQ 延迟队列

操作系统任务

Linux crontab

优缺点:

  • 优点:方便修改定时规则,支持一些较复杂的定时规则,通过文件可以统一管理配好的各种定时脚本。
  • 缺点:如果定时任务非常多,不太好找,而且必须要求操作系统是 linux ,否则无法执行。