文章目录
引言
之前的文章《线程池源码分析》,详细介绍了线程池的原理。
这篇在此基础上聊聊 定时类的线程池 ScheduledThreadPool,
假定线程池那篇你已经看过了哈!
项目中,经常会用到定时任务,
比如基于注解的 @Scheduled,配合 cron 表达式。
那源码级别,若要使用定时任务,不大可能再集成 spring 框架来实现
比如 Eureka 的心跳机制,典型的定时任务,
它的实现就是应用的 定时类线程池,
也就是今天所说的 ScheduledThreadPool 。
今天详细剖析下它的源码及使用。
一、ScheduledThreadPool 使用示例
1. 延时类的定时任务 schedule
public static void main(String[] args) throws Exception {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
long start = System.currentTimeMillis();
log.info("延迟的 定时任务执,开始时间:{}", start);
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
long running = System.currentTimeMillis();
log.info(" 执行任务,时间:{}", running);
log.info("相隔毫秒数:{}", running - start);
}
},3, TimeUnit.SECONDS);
scheduledExecutorService.shutdown();
}
这个示例,任务提交后,不是立马执行。按指定的延迟时间,过了这个时间再执行。
比如示例中,任务提交后,延迟3秒再执行。

2. 延时类,固定周期执行任务 scheduleAtFixedRate
public static void main(String[] args) throws Exception {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
long start = System.currentTimeMillis();
log.info("延迟类固定周期任务,开始时间:{}", start);
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@SneakyThrows
@Override
public void run() {
long running = System.currentTimeMillis();
long dif = running - start;
log.info("与任务提交时间,相隔毫秒数:{}", dif);
if(dif > 20*1000){
scheduledExecutorService.shutdown();
log.info("延迟类固定周期任务 end");
}
Thread.sleep(1000);
}
},5, 2, TimeUnit.SECONDS);
}
这个示例是,任务提交5秒之后,才开始执行。之后每隔 2 秒,周期性执行。(每次任务执行时间耗时1


2753

被折叠的 条评论
为什么被折叠?



