定时任务最简单的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 来执行任务,不会造成任务间的相互影响。

相关文章
|
8月前
|
存储 数据处理 调度
Python实现定时任务的方案及其比较
Python实现定时任务的方案及其比较
160 0
|
Java
简单实现一个定时任务
简单实现一个定时任务
143 0
|
Linux 应用服务中间件
Linux基本命令-03(定时任务)
Linux基本命令-03(定时任务)
|
开发者 微服务
项目中整合定时任务 | 学习笔记
快速学习 项目中整合定时任务
127 0
|
缓存 运维 安全
金鱼哥RHCA回忆录:DO447构建高级作业工作流--作业调度和配置通知
第十章 构建高级作业工作流--作业调度和配置通
134 0
金鱼哥RHCA回忆录:DO447构建高级作业工作流--作业调度和配置通知
|
Java Linux
Springboot2.x整合定时任务的小案例(某年某月某日执行)
有时候在开发中经常会使用一些定时的任务,比如果整点推送,或者是每隔一段时间给客户发送一个消息等等。这篇文章主要是通过Springboot整合Schedule来实现一个定时任务,非常的简单
329 0
Springboot2.x整合定时任务的小案例(某年某月某日执行)
|
存储 XML Java
学会这10种定时任务,我有点飘了
学会这10种定时任务,我有点飘了
学会这10种定时任务,我有点飘了
|
Java 调度
定时任务最简单的3种实现方法(超好用)上
定时任务最简单的3种实现方法(超好用)
146 0
|
存储 NoSQL Java
定时任务最简单的3种实现方法(超好用)下
定时任务最简单的3种实现方法(超好用)
496 0
定时任务最简单的3种实现方法(超好用)下
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | 在编辑器中手动设置 各个脚本的执行顺序
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
【Unity3D 灵巧小知识点】☀️ | 在编辑器中手动设置 各个脚本的执行顺序

热门文章

最新文章