我是靠谱客的博主 年轻月饼,这篇文章主要介绍使用ScheduledThreadPoolExecutor做延时消息处理,现在分享给大家,希望可以做个参考。

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做延时消息处理内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(122)

评论列表共有 0 条评论

立即
投稿
返回
顶部