我是靠谱客的博主 年轻月饼,最近开发中收集的这篇文章主要介绍使用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做延时消息处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部