当前位置: 首页 > article >正文

关于延迟任务线程池,Java提供的ScheduledThreadPoolExecutor,Spring提供的ThreadPoolTaskScheduler

今天讲解定时任务、延迟任务的线程池使用方式:
1、从 java 角度
2、从 Spring 框架角度

文章目录

      • Java提供:ScheduledExecutorService接口(创建延迟任务线程池)
        • ① 用法1:
          • 1. 重写afterExecute方法
          • 2. .schedule()方法调度任务
        • ② 用法2:
      • Spring提供:ThreadPoolTaskScheduler类
        • 1、基于 Java 配置文件创建对象:
        • 2. .schedule()方法调度任务(结合Cron)

Java提供:ScheduledExecutorService接口(创建延迟任务线程池)

这个接口继承 ExecutorService 接口。

① 用法1:

ScheduledThreadPoolExecutor 类 是 ScheduledExecutorService 接口的实现类,属于 java 并发包。它允许你设置一个固定数量的核心线程池,并调度任务在某个延迟时间后执行,或以固定的频率重复执行任务。

return new ScheduledThreadPoolExecutor(
    5,         // 核心线程池大小
    new BasicThreadFactory.Builder()                // 自定义线程工厂
        .namingPattern("schedule-pool-%d")          // 线程的命名模式
        .daemon(true)                               // 线程设为守护线程
        .build(),
    new ThreadPoolExecutor.CallerRunsPolicy()       // 任务拒绝策略
)
{
        @Override
        protected void afterExecute(Runnable r, Throwable t) {
            //调用父类的方法
            super.afterExecute(r, t);
            ThreadUtil.printException(r, t);
        }
};   

解析:

new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()

  • 创建一个BasicThreadFactory实例,用于创建线程。

    BasicThreadFactory 是 lang3 包下的工具类,使用时需要引入依赖。

  • namingPattern("schedule-pool-%d")指定了线程的命名模式

    比如:这里就是 schedule-pool-1, schedule-pool-2 等。

  • daemon(true)表示这些线程是守护线程

    守护线程在所有非守护线程终止后会自动结束,适用于后台运行的任务。

  • build()方法用于构建这个工厂实例。

1. 重写afterExecute方法

② 重写了 ThreadPoolExecutorafterExecute(Runnable r, Throwable t) 方法,这个方法会在每个任务执行完毕后调用,提供了一个钩子来处理任务执行后的逻辑。这个方法默认实现为空方法,但可以在子类中重写该方法来自定义行为。

方法参数:

  • Runnable r:当前执行的任务。
  • Throwable t:如果任务执行过程中抛出了异常,该参数会包含异常信息;如果任务正常完成,则该参数为 null

该方法在任务 Runnable 完成 或 抛出异常之后执行,不论任务是正常执行完成还是由于异常中断,都会调用此方法。

2. .schedule()方法调度任务
对象实例.schedule(task, 10, TimeUnit.MILLISECONDS);
  • 第一个参数:要执行的任务,它必须是实现了 RunnableCallable 的对象。这里传递了一个 task。(就是TimerTask的对象,TimerTaskRunnable 的子类)
  • 第二个参数:延迟时间,表示任务将在延迟 多少 毫秒后执行。
  • 第三个参数:时间单位,指定时间延迟的单位为毫秒。

② 用法2:
// 也可以这样创建对象实例
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);

scheduledExecutorService.scheduleAtFixedRate(()->{},100,10,TimeUnit.MILLISECONDS);

scheduleAtFixedRate 是周期性执行,schedule 是延迟执行,scheduleAtFixedRate 的参数为:

  • 任务
  • initialDelay 参数含义:初始延迟时间
  • period 参数含义:执行任务的周期间隔
  • 时间单位

Spring提供:ThreadPoolTaskScheduler类

1、ThreadPoolTaskScheduler是 Spring 框架 提供的一种用于调度任务的类,它是基于 Java 的 ScheduledThreadPoolExecutor 类 的封装,支持定时任务、延迟任务和周期性任务的执行。

2、ThreadPoolTaskScheduler 实现了 TaskScheduler 接口

1、基于 Java 配置文件创建对象:
@Configuration
public class Test {
    @Bean
    public ThreadPoolTaskScheduler test(){
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        // 设置线程池大小
        scheduler.setPoolSize(10);
        // 设置线程名称前缀
        scheduler.setThreadNamePrefix("MyTaskScheduler-");
        // 应用关闭时等待任务完成
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        // 等待任务完成的最大时间
        scheduler.setAwaitTerminationSeconds(30);
        return scheduler;
    }
}

2、核心属性:

属性含义
poolSize设置线程池的大小,默认为 1
threadNamePrefix设置线程名称前缀,便于调试和监控线程池的任务
waitForTasksToCompleteOnShutdown如果为 true,则应用关闭时会等待所有已提交的任务完成
awaitTerminationSeconds设置应用关闭时等待任务完成的最大时间(单位:秒)
removeOnCancelPolicy(默认 false)在任务被取消后是否从任务队列中移除
2. .schedule()方法调度任务(结合Cron)

在之前基于 Java 的 ScheduledThreadPoolExecutor 内容中,我们知道了 schedule() 方法的使用情况。

但是: Spring 提供 ThreadPoolTaskScheduler 的 schedule() 方法,参数不一样,如下:

这里介绍如何结合 Cron 表达式使用:

String cron = .......;
.schedule(Runnable runnable, new CronTrigger(cron));

还可以对 Cron 表达式进行验证:

// 验证cron表达式
boolean a = CronExpression.isValidExpression(cron);

至此,文章结束,谢谢你的点赞和收藏!!!


http://www.kler.cn/a/567567.html

相关文章:

  • flutter 专题 八十 Flutter 应用性能检测与优化
  • AUTOSAR整体架构与应用层详解和综合实例
  • 基于fast-whisper模型的语音识别工具的设计与实现
  • 【西瓜书《机器学习》七八九章内容通俗理解】
  • JWT概念及JAVA使用
  • Winbox5怎样设置上网
  • PAT乙级(1026 程序运行时间)C语言超详细解析
  • 使用Spring Boot与达梦数据库(DM)进行多数据源配置及MyBatis Plus集成
  • seacms v9 实现的MySQL注入
  • Kubernetes 详解笔记
  • Word快速替换修改学术论文所有中的中括号引用未上标格式
  • BiliBili视频下载-原理与实现Python+FFmpeg
  • 【Netty】五种经典 IO 模型详解,附各种模型流程图及流程详解
  • 特征值与特征向量
  • 【GraphQL API 漏洞简介】
  • vue3+TS使用i18n.global.locale,页面要刷新时才更新
  • 第十四届蓝桥杯:DFS之飞机降落
  • 如何在VUE框架下渲染出来一个水球图
  • 建筑兔零基础人工智能自学记录34|深度学习与神经网络2
  • AI时代保护自己的隐私