定时任务最简单的3种实现方法(超好用)中

简介: 定时任务最简单的3种实现方法(超好用)

TOP 2:ScheduledExecutorService


ScheduledExecutorService 也是 JDK 1.5 自带的 API,我们可以使用它来实现定时任务的功能,也就是说 ScheduledExecutorService 可以实现 Timer 类具备的所有功能,并且它可以解决了 Timer 类存在的所有问题


ScheduledExecutorService 实现定时任务的代码示例如下:


public class MyScheduledExecutorService {
    public static void main(String[] args) {
        // 创建任务队列
        ScheduledExecutorService scheduledExecutorService =
                Executors.newScheduledThreadPool(10); // 10 为线程数量
  // 执行任务
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            System.out.println("Run Schedule:" + new Date());
        }, 1, 3, TimeUnit.SECONDS); // 1s 后开始执行,每 3s 执行一次
    }
}


程序执行结果如下:


Run Schedule:Mon Aug 17 21:44:23 CST 2020

Run Schedule:Mon Aug 17 21:44:26 CST 2020

Run Schedule:Mon Aug 17 21:44:29 CST 2020


ScheduledExecutorService 可靠性测试


① 任务超时执行测试


ScheduledExecutorService 可以解决 Timer 任务之间相应影响的缺点,首先我们来测试一个任务执行时间过长,会不会对其他任务造成影响,测试代码如下:


public class MyScheduledExecutorService {
    public static void main(String[] args) {
        // 创建任务队列
        ScheduledExecutorService scheduledExecutorService =
                Executors.newScheduledThreadPool(10);
        // 执行任务 1
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            System.out.println("进入 Schedule:" + new Date());
            try {
                // 休眠 5 秒
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Run Schedule:" + new Date());
        }, 1, 3, TimeUnit.SECONDS); // 1s 后开始执行,每 3s 执行一次
        // 执行任务 2
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            System.out.println("Run Schedule2:" + new Date());
        }, 1, 3, TimeUnit.SECONDS); // 1s 后开始执行,每 3s 执行一次
    }
}


程序执行结果如下:


Run Schedule2:Mon Aug 17 11:27:55 CST 2020

进入 Schedule:Mon Aug 17 11:27:55 CST 2020

Run Schedule2:Mon Aug 17 11:27:58 CST 2020

Run Schedule:Mon Aug 17 11:28:00 CST 2020

进入 Schedule:Mon Aug 17 11:28:00 CST 2020

Run Schedule2:Mon Aug 17 11:28:01 CST 2020

Run Schedule2:Mon Aug 17 11:28:04 CST 2020


从上述结果可以看出,当任务 1 执行时间 5s 超过了执行频率 3s 时,并没有影响任务 2 的正常执行,因此使用 ScheduledExecutorService 可以避免任务执行时间过长对其他任务造成的影响


② 任务异常测试


接下来我们来测试一下 ScheduledExecutorService 在一个任务异常时,是否会对其他任务造成影响,测试代码如下:


public class MyScheduledExecutorService {
    public static void main(String[] args) {
        // 创建任务队列
        ScheduledExecutorService scheduledExecutorService =
                Executors.newScheduledThreadPool(10);
        // 执行任务 1
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            System.out.println("进入 Schedule:" + new Date());
            // 模拟异常
            int num = 8 / 0;
            System.out.println("Run Schedule:" + new Date());
        }, 1, 3, TimeUnit.SECONDS); // 1s 后开始执行,每 3s 执行一次
        // 执行任务 2
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            System.out.println("Run Schedule2:" + new Date());
        }, 1, 3, TimeUnit.SECONDS); // 1s 后开始执行,每 3s 执行一次
    }
}


程序执行结果如下:


进入 Schedule:Mon Aug 17 22:17:37 CST 2020

Run Schedule2:Mon Aug 17 22:17:37 CST 2020

Run Schedule2:Mon Aug 17 22:17:40 CST 2020

Run Schedule2:Mon Aug 17 22:17:43 CST 2020


从上述结果可以看出,当任务 1 出现异常时,并不会影响任务 2 的执行


ScheduledExecutorService 小结


在单机生产环境下建议使用 ScheduledExecutorService 来执行定时任务,它是 JDK 1.5 之后自带的 API,因此使用起来也比较方便,并且使用 ScheduledExecutorService 来执行任务,不会造成任务间的相互影响。

相关文章
|
调度
关于定时任务,看着一系列就够了——2.Cron表达式
软件开发定时任务基础—— Cron 表达式介绍
1006 0
关于定时任务,看着一系列就够了——2.Cron表达式
|
1月前
|
存储 数据处理 调度
Python实现定时任务的方案及其比较
Python实现定时任务的方案及其比较
31 0
|
NoSQL Java 调度
定时任务基本使用指南(cron 时间表达式、Spring 自带调度器、JDK 原生定时器)
定时任务基本使用指南(cron 时间表达式、Spring 自带调度器、JDK 原生定时器)
473 0
|
8月前
|
运维 调度 开发者
深入解析 Cron 表达式:定时任务的时间艺术
大家好,今天我们将一起来深入了解 Cron 表达式,这是计划任务中不可或缺的时间表达式。无论你是一名开发者、运维工程师还是对定时任务感兴趣的读者,本文都将帮助你理解 Cron 表达式的基本结构、常用格式以及如何编写自定义的定时任务。也为大家提供了一个在线cron表达式生成的工具,让我们开始探索这项定时任务的时间艺术吧!
544 0
深入解析 Cron 表达式:定时任务的时间艺术
|
10月前
|
调度
【解决方案 二十】作业调度系统cron表达式详解
【解决方案 二十】作业调度系统cron表达式详解
48 0
|
Linux 应用服务中间件
Linux基本命令-03(定时任务)
Linux基本命令-03(定时任务)
|
开发者 微服务
项目中整合定时任务 | 学习笔记
快速学习 项目中整合定时任务
87 0
|
存储 NoSQL Java
定时任务最简单的3种实现方法(超好用)下
定时任务最简单的3种实现方法(超好用)
435 0
定时任务最简单的3种实现方法(超好用)下