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