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

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分钟执行

相关文章:

  • Android MVC架构的现代化改造:构建清晰单向数据流
  • Rspack:字节跳动自研 Web 构建工具-基于 Rust打造高性能前端工具链
  • python编译exe执行时报错:OSError:[WinError6]句柄无效
  • 代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?
  • HTTP学习
  • CSS: 选择器与三大特性
  • Abaqus学习笔记
  • 【纯干货~~】Vue 组件封装通用方法论
  • 2025年3月,​韩先超对国网宁夏进行Python线下培训
  • Android Firebase登录和存储用户数据方案
  • 熔断机制的实战:高并发下怎么优雅“断电”保命?
  • 杭州抖音代播公司推荐——品融电商:助力品牌抢占直播电商新风口
  • Go使用Gin写一个对MySQL的增删改查服务
  • SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理标准)-(二)
  • 快消品行业案例:安达发APS计划排产软件如何实现季节性需求波动应对?
  • 英皇娱乐X乐华娱乐携手造星!“英皇乐华青少年艺人培训班”正式启动!
  • 多智能体学习CAMEL-调用api
  • 《零基础学机器学习》学习大纲
  • 正点原子IMX6U开发板移植Qt时出现乱码
  • 6:点云处理—QT三维窗口显示
  • 湖南省职业病防治院通报3岁女童确诊“铊中毒”:去年病例,编辑误写为“近日”
  • 罗氏制药全新生物制药生产基地投资项目在沪启动:预计投资20.4亿元,2031年投产
  • 国家主席习近平抵达莫斯科
  • 吴清:加强监管的同时传递监管温度,尽力帮助受影响企业应对美加征关税的冲击
  • 缅甸国防军继续延长临时停火期限至5月31日
  • 体坛联播|米兰逆转热那亚豪取3连胜,阿诺德官宣离开利物浦