概述
ScheduledThreadPoolExecutor 也是jdk提供的,解决了 Timer 单线程和异常崩溃等问题
demo
import lombok.extern.slf4j.Slf4j;
import java.time.LocalTime;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Slf4j
public class ScheduledThreadPoolExecutorDemo {
public static void main(String[] args) {
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2, new ThreadPoolExecutor.CallerRunsPolicy());
log.info("提交延时任务: {}", LocalTime.now());
executor.schedule(() -> log.info("执行延时任务: {}", LocalTime.now()), 5, TimeUnit.SECONDS);
}
}
测试结果
实现原理
ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,也就是继承了线程池,所以可以有很多个线程来执行任务。
ScheduledThreadPoolExecutor在构造的时候会传入一个DelayedWorkQueue阻塞队列,所以线程池内部的阻塞队列是DelayedWorkQueue。
在提交延迟任务的时候,任务会被封装一个任务会被封装成ScheduledFutureTask对象,然后放到DelayedWorkQueue阻塞队列中。
ScheduledFutureTask实现了前面提到的Delayed接口,所以其实可以猜到DelayedWorkQueue会根据ScheduledFutureTask对于Delayed接口的实现来排序,所以线程能够获取到最早到延迟时间的任务。
当线程从DelayedWorkQueue中获取到需要执行的任务之后就会执行任务。
最后
以上就是年轻月饼为你收集整理的使用ScheduledThreadPoolExecutor做延时消息处理的全部内容,希望文章能够帮你解决使用ScheduledThreadPoolExecutor做延时消息处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复