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

SpringBoot使用定时线程池ScheduledThreadPoolExecutor

定时线程池是一种专门用于执行定时任务的线程池,它结合了线程池的优势和定时任务的功能,能够高效地管理和调度任务。

定时线程池是一种特殊的线程池,它不仅可以执行普通任务,还可以安排任务在未来某个时间点执行,或者以固定的速率重复执行。

配置管理器


import com.project.common.utils.Threads;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;/*** 线程池配置***/
@Configuration
public class ThreadPoolConfig {// 核心线程池大小private int corePoolSize = 50;/*** 执行周期性或定时任务*/@Bean(name = "scheduledExecutorService")protected ScheduledExecutorService scheduledExecutorService() {return new ScheduledThreadPoolExecutor(corePoolSize,new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),new ThreadPoolExecutor.CallerRunsPolicy()) {@Overrideprotected void afterExecute(Runnable r, Throwable t) {super.afterExecute(r, t);Threads.printException(r, t);}};}
}

提交一次性任务

     @AutowiredScheduledExecutorService executorService;@GetMapping(value = "/test")public  void test(String[] args) {executorService.schedule(() ->{// TODO: 业务代码}, 1, TimeUnit.SECONDS); // 在1秒后执行任务}

提交固定速率任务

 @AutowiredScheduledExecutorService executorService;@GetMapping(value = "/test")public  void test(String[] args) {executorService.scheduleAtFixedRate(() ->{// TODO: 业务代码}, 2, 3, TimeUnit.SECONDS); // 在2秒后开始执行任务,每隔3秒重复执行}

提交固定延迟任务

@AutowiredScheduledExecutorService executorService;@GetMapping(value = "/test")public  void test(String[] args) {executorService.scheduleWithFixedDelay(() ->{// TODO: 业务代码}, 2, 3, TimeUnit.SECONDS); // 在2秒后开始执行任务,每次执行完毕后等待3秒再执行下一次}

定时线程池的应用场景

定时任务调度

场景描述:需要定期执行某些任务,比如每天凌晨清理日志、每小时统计系统数据等。

实现方式:使用 scheduleAtFixedRate 或 scheduleWithFixedDelay 方法,设置任务的执行间隔。

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(() -> {System.out.println("执行每日数据备份任务: " + new Date());
}, 0, 24, TimeUnit.HOURS); // 每隔24小时执行一次

缓存过期清理

场景描述:在缓存系统中,需要定期清理过期的缓存数据。

实现方式:使用定时线程池定期扫描缓存,清理过期的数据。

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(() -> {cache.cleanExpiredEntries(); // 清理过期缓存System.out.println("缓存清理完成: " + new Date());
}, 0, 1, TimeUnit.HOURS); // 每隔1小时清理一次

心跳检测

场景描述:在分布式系统中,需要定期向其他服务发送心跳包,检测服务是否存活。

实现方式:使用定时线程池定期发送心跳请求。

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(() -> {boolean isAlive = heartBeatCheck(); // 发送心跳检测if (!isAlive) {System.out.println("服务不可用,触发告警!");}
}, 0, 10, TimeUnit.SECONDS); // 每隔10秒检测一次

延迟任务执行

场景描述:某些任务需要延迟一段时间后执行,比如订单超时未支付自动取消。

实现方式:使用 schedule 方法,设置任务的延迟时间。

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.schedule(() -> {orderService.cancelOrder(orderId); // 取消订单System.out.println("订单已取消: " + orderId);
}, 30, TimeUnit.MINUTES); // 延迟30分钟执行
http://www.xdnf.cn/news/4722.html

相关文章:

  • 【C++游戏引擎开发】第34篇:C++实现反射
  • 【嵌入式开发-LCD】
  • 【平面波导外腔激光器专题系列】1064nm单纵模平面波导外腔激光器‌
  • C++继承语法讲解
  • 2025最新:3分钟使用Docker快速部署Redis集群
  • 为什么 MySQL 用 B+ 树作为数据的索引,以及在 InnoDB 中数据库如何通过 B+ 树索引来存储数据以及查找数据
  • base64与图片的转换和预览(高阶玩法)
  • 【Ubuntu系统镜像文件下载(官网)】
  • AI赋能高频PCB信号完整性优化
  • 正态分布和幂律分布
  • 存储器:DDR和HBM的区别
  • css样式基础
  • Python中,正则表达式,
  • 观察者GIS知识星球资源汇总-2025V1
  • 当数据爆炸遇上SQL Server:优化策略全链路解析
  • 深度解析语义分割评估指标:从基础到创新实践
  • TLS(传输层安全协议)
  • 66、微服务保姆教程(九)微服务的高可用性
  • 代码随想录第37天:动态规划10(公共子序列问题)
  • css3伸缩盒模型第三章(伸缩相关)
  • obj = null; 赋值null之前没有其他引用指向obj对象,那么,当obj=null时,会被垃圾回收机制立即回收吗?
  • 湖北理元理律师事务所:债务优化中的“生活保障”方法论
  • PCIe控制器介绍(二)
  • 47. 全排列 II
  • C++类继承学习笔记
  • 【软件推荐——ScreenToGif】
  • flutter 资料收集
  • Unity基础学习(九)基本组件Transform
  • 土壤电导率传感器测定土壤溶液中的可溶盐离子 智慧农业指导作用
  • 如何使用原点回归方式35进行回原