关于延迟任务线程池,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()       // 任务拒绝策略
)
{@Overrideprotected 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 {@Beanpublic 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.rhkb.cn/news/26351.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python PDF文件拆分-详解

目录 使用工具 将PDF按页数拆分 将PDF的每一页拆分为单独的文件 将PDF按指定页数拆分 根据页码范围拆分PDF 根据指定内容拆分PDF 将PDF的一页拆分为多页 在日常生活中,我们常常会遇到大型的PDF文件,这些文件可能难以发送、管理和查阅。将PDF拆分成…

链表的概念及功能实现

一、链表之单向链表 前面我们使用顺序储存结构实现的顺序表,虽然查询的时候很快,但在进行元素的增加或者删除的时候:比较麻烦,需要你去移动大量的元素把数据删除或者增加。 链表里的数据是以结点方式来表示的,每一个结点的组成是…

【Python 语法】算法合集

查找二分查找代码大 O 表示法 广度优先搜索代码 狄克斯特拉算法 递归递归调用栈 分而治之(divide and conquer,D&C)贪心教室调度问题背包问题集合覆盖问题 动态规划背包问题旅游行程最优化 遇到问题时, 如果不确定该如何 高效…

Android 应用开发中,证书、签名和加固简述

在 Android 应用开发中,证书、签名和加固是保障应用安全和完整性的重要机制,各自作用如下: 一、应用证书(Digital Certificate) 作用: 身份标识:证书包含开发者的公钥、组织信息等,用…

在什么情况下需要使用光谱相机呢?

1.需要捕捉不可见光信息时 光谱相机不仅能捕捉可见光,还能记录红外、紫外等波段的光谱信息。以下场景尤其适用: 环境监测:检测水质、空气污染物等肉眼无法观察的物质。 农业监测:分析植物的近红外反射率,判断作物健…

一周一个Unity小游戏2D反弹球游戏 - 球板的发球

前言 本文将实现当游戏开始时球在球板上,且不具备物理性,在Windows平台上通过点击屏幕来球发射,安卓平台上当手指触摸到屏幕上时进行发球,并此时开始具备物理性。 发球逻辑 首先在球板上创建一个球的发射点,新建一个空的游戏物体,并命名为BallPoint,并将其作为SpringBoa…

【算法】图论 —— Floyd算法 python

洛谷 B3647 【模板】Floyd 题目描述 给出一张由 n n n 个点 m m m 条边组成的无向图。 求出所有点对 ( i , j ) (i,j) (i,j) 之间的最短路径。 输入格式 第一行为两个整数 n , m n,m n,m,分别代表点的个数和边的条数。 接下来 m m m 行,每行三…

从实例出发,讲解BLE专业调试工具nRF Connect

nRF Connect是NORDIC Semiconductor提供的一套强大的低功耗蓝牙(BLE)开发工具和应用程序,本文从两个示例着手分析:iBeacon和Eddystone协议的信标Beacon 前置知识:什么是信标Beacon? 信标(Beacon…

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…

使用Truffle、Ganache、MetaMask、Vue+Web3完成的一个简单区块链项目

文章目录 概要初始化Truffle项目创建编写合约编译合约配置Ganache修改truffle-config.js文件编写迁移文件部署合约使用Truffle 控制台使用MetaMask和VueWeb3与链交互 概要 使用Truffle、Ganache、MetaMask、VueWeb3完成的一个简单区块链项目。 初始化Truffle项目 安装好truf…

在线会议时, 笔记本电脑的麦克风收音效果差是为什么

背景 最近在线面试. 使用腾讯会议或者飞书, 戴耳机参加在线面试, 遇到好几个面试官说我的音质不好. 一直没在意, 后来反思, 应该是电脑哪里出了问题. 排查 先买了一副品牌有线耳机, 测试后本地录制的声音仍然品质很差去掉耳机延长线后, 麦克风品质仍然很差最终找到答案, 原…

通过百度构建一个智能体

通过百度构建一个智能体 直接可用,我不吝啬算力 首先部署一个模型,我们选用deepseek14 构建智能体思考步骤,甚至多智能体; from openai import OpenAIclass Agent:def __init__(self, api_key, base_url, model

解决“request returned Internal Server Error for API route and version xxx”错误

一、问题描述 ragflow/README_zh.md at main infiniflow/ragflowhttps://github.com/infiniflow/ragflow/blob/main/README_zh.md 当我们使用Docker部署ragflow,确认服务器状态时,提示“request returned Internal Server Error for API route and version http://%2F%2F.%…

OpenFlexure记录

https://openflexure.org/projects/microscope/build

游戏引擎学习第131天

仓库:https://gitee.com/mrxiao_com/2d_game_3 运行游戏并识别我们的小问题 今天的工作重点是对游戏引擎进行架构优化,特别是针对渲染和多线程的部分。目前,我们的目标是让地面块在独立线程上进行渲染,以提高性能。在此过程中,我…

Hbase伪分布安装教程,详细版

注意Hbase版本与Hadoop版本的兼容,还有与JDK版本的兼容 本次用到的Hbase为2.4.6版本,Hadoop为3.1.3版本,JDK为JDK8 打开下面的网址查看兼容问题 Apache HBase Reference Guidehttps://hbase.apache.org/book.html#configuration 点击基础先…

使用Hydra进行AI项目的动态配置管理

引言:机器学习中的超参数调优挑战 在机器学习领域,超参数调优是决定模型性能的关键环节。不同的模型架构,如神经网络中的层数、节点数,决策树中的最大深度、最小样本分割数等;以及各种训练相关的超参数,像学习率、优化器类型、批量大小等,其取值的选择对最终模型的效果…

基于Kerberos认证对接华为云Elasticsearch

可以通过华为官方提供的Elasticsearch Java客户端(基于Elasticsearch官方版本改造),实现基于Kerberos认证访问和操作华为云Elasticsearch;亦可以使用更加通用的开源Elasticsearch Java客户端bboss,实现基于Kerberos认证…

Rocky Linux 8.5 6G内存 静默模式(没图形界面)安装Oracle 19C

Oracle19c 下载地址 Database Software Downloads | Oraclehttps://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee 目录 一、准备服务器 1、服务器可以克隆、自己装 2、修改主机名 3、重启 4、关闭selinux 5、关闭防火墙 5.1、…

6.6.6 嵌入式SQL

文章目录 2个核心问题识别SQL语句主语言和SQL通信完整导图 2个核心问题 SQL语句嵌入高级语言需要解决的2个核心问题是:如何识别嵌入语句?如何让主语言(比如C,C语言)和SQL通信? 识别SQL语句 为了识别主语言中嵌入的SQL…