使用ScheduledThreadPoolExecutor做延时消息处理

ScheduledThreadPoolExecutor --- DelayedWorkQueue源码解析 DelayWorkQueue与ScheduledFutureTask分析 阅读详情

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中获取到需要执行的任务之后就会执行任务。

三电平逆变器LC滤波设计避坑指南:从SVPWM谐波到Simulink仿真验证 本文详细解析了三电平逆变器LC滤波设计中的关键问题,从SVPWM谐波特性到Simulink仿真验证,提供了800V/10kW系统的参数计算方法和优化技巧。通过实际案例和仿真配置示例,帮助工程师避免常见设计误区,提升电能质量和系统稳定性。 阅读详情

相关推荐

低成本主从机械臂系统构建:6D位姿数据采集与VLA模型训练实战

本文详细介绍了如何构建低成本主从机械臂系统,实现高精度6D位姿数据采集与VLA模型训练。通过300美元级别的硬件组合,系统达到±1mm位置精度和≤0.5°姿态误差,满足Vision-Language-Action模型的多模态训练需求。文章涵盖硬件选型、数据采集技巧、模型训练实战经验,为机器人研究提供经济高效的解决方案。

r7s8t的博客 266

Android定时任务:Timer与Handler机制对比与应用

在Android开发中,定时任务是实现周期性操作的核心技术。Timer作为Java标准库提供的通用定时器,通过独立线程实现任务调度,适合后台计算场景。而Handler基于Looper消息队列机制,与主线程深度集成,更适合UI相关的定时操作。从实现原理看,Timer依赖线程轮询和Object.wait(),而Handler采用epoll事件监听,两者在内存占用、调度精度等方面存在显著差异。实际开发中,需要根据任务性质(UI更新/后台计算)、执行频率和精度要求选择合适的方案。现代Android开发还可使用Sch

weixin_30245867的博客 8272

电阻应变式力传感器

电阻应变式力传感器

lu_fresh_student的博客 5075

ScheduledThreadPoolExecutor实现延时及定时任务的步骤

ScheduledThreadPoolExecutor提供的两个方法来完成延迟及定时执行任务 scheduleAtFixedRate及scheduleWithFixedDelay 大致执行步骤: 1)创建task任务 2)将任务加入到延迟队列 3)启用线程通过getTask方法从队列中获取任务 4)延迟队列中的take方法获取任务时,会根据等待时间阻塞任务; 针对scheduleAtFixedRate源码分析: public ScheduledFuture<?> schedul

qq_42949615的博客 3537

maya权重拷贝一对一,一对多

是不是有时候盔甲很多很碎头很大,用代理一个个拷贝很麻烦吧 用下面代码直接运行进行一对多或者一对一拷贝 第一个先选择参考物体,加选其他一堆有的没的有权重或没权重的物体执行一键拷贝,就可以啦 以下是源码送上,带走吧 ------------------------ #! -*- coding:utf -8 -*- #author:liubingdong #date:20...

weixin_30852367的博客 1532

华为AR6140E/S5735设备密码策略配置全攻略:从复杂度到锁定机制

本文详细介绍了华为AR6140E/S5735设备的密码策略配置方法,涵盖密码复杂度、时效性和防护性三大核心维度。通过具体的CLI命令示例,指导管理员如何设置密码长度、字符组合、有效期及登录失败锁定等安全机制,为企业网络提供全面的用户名密码防护策略。

weixin_30836759的博客 531

newScheduledThreadPool延时任务线程池,实现原理

Excutors的newScheduleThreadPool程序结构,我们在构造ThreadPoolExcute时,Queue队列使用了DelayedWorkQueue,这是一个可延时执行阻塞任务的队列,Delayed元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed元素。如果延迟都还没有期满,则队列没有头部,并且poll将返回null。condition的定义Condition available = lock.newCondition();(n

lisuyibmd的专栏 1万+

CODESYS连接触摸屏

触摸屏:威纶通-MT8071iP(网络IP:192.168.1.10) 控制器:研华AMAX-5580(PAC)(Win10系统,网络IP:192.168.1.3) CODESYS RTE:RTE 64 V3.5 SP13 Build05 笔记本:Thinkpad L14(网络IP:192.168.1.2) CODESYS IDE:V3.5 SP13(ADD ON V3.5.13.5) 一、确认网络通讯正常(关闭防火墙) 笔记本与触摸屏网络测试情况 笔记本与控制器网络测试情况 二、控制器部分 1、新建

Leo的博客 1万+

ScheduledThreadPoolExecutor源码分析-延时线程池是如何实现延时执行的

ScheduledThreadPoolExecutor 线程池是如何实现延时执行的?和线程池的执行流程无关,延时是通过延时队列实现的,当我们提交一个任务到线程池时,它不是先执行任务,而是先把任务添加到延时队列,然后启动 worker 线程执行,worker 线程以阻塞的方法从延时队列中获取任务,如果任务没到执行时间,worker 线程会等待需要延时的时间,等待延时时间结束后,进入新一轮循环,此时延时时间小于等于0,worker 线程可以从延时队列中获取任务,获取到任务后,走正常线程池的流程,执行任务,从而达

悟世君子的博客 1185

DSP TMS320FF28335程序从FLASH中拷贝到RAM中的两种方法及FLASH烧写方法

程序从FLASH中拷贝到RAM中执行的方法 DSP的程序下载执行方式有两种:一种是下载到RAM中在线执行,一种是下载到FLASH中执行。在RAM中执行时,具有执行速度快,可以无限次下载的特点,但是RAM的特点是掉电丢失数据。FLASH具有掉电不丢失数据的特点,但是同时存在执行速度慢和擦写次数有限的缺点。因此综合两者的特点,在DSP的开发过程中一般会结合使用两者。在前期程序调试过程,由于需要频繁的

AEECREN的博客 1万+

0.嵌入式控制器EC实战 Embedded Controller开发概述

文章目录前言1.嵌入式控制器EC概述2.EC芯片框图(IT8502为例)3.General Purpose I/O Port (GPIO)4.SMBus(System Management Bus,系统管理总线)5.PWM、TACH6.KBC(KeyBoard Controller)7.PS/28.ADC(模数转换)总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 1.嵌入式控制器EC概述 嵌入式控制器EC是挂在CPU的L

qq_30135687的博客 1万+

并发编程十 定时任务&定时线程池

ScheduledThreadPoolExecutor用法以及场景

东风麦芽糖 815

一文让你轻松理解Wi-Fi理论速率计算方式

如上所示,在使用FDM的802.11协议上,最小子载波带宽为312.5KHz,那一个信道频宽为20MHz的信道可以分成64个子载波,但是由于技术原因,有效使用的是52个子载波,实际用于数据传输的只有48个,有4个子载波充当导频载波。载波:交流信号或者直流信号本身不具备数据传输能力,但是如果信号发生很小的波动或者变化,从而实现数据的收发。所谓子载波,就是将信号划为为很多的小信道,这些小信道可以实现数据的并发传输,子载波我们英文称为subcarrier,也称为音调(tone)。Symbol time如下所示。

1042484520@qq.com(邮箱) 3448

盘点JAVA中延时任务的几种实现方式

(1)基于内存,应用重启(或宕机)会导致任务丢失 (2)基于内存存放队列,不支持集群 (3)依据compareTo方法排列队列,调用take阻塞式的取出第一个任务(不调用则不取出),比较不灵活,会影响时间的准确性。(1)基于内存,应用重启(或宕机)会导致任务丢失 (2)基于内存挂起线程实现延时,不支持集群 (3)代码耦合性大,不易维护 (4)一个任务就要新建一个线程绑定任务的执行,容易造成资源浪费。(1)基于内存,应用重启(或宕机)会导致任务丢失 (2)基于内存存放任务,不支持集群。

BASK2312的博客 1788

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

使用Redisson实现延时消息

Redis 的过期事件监听是基于 pub/sub 的,key 过期时会 pub 消息到一个内置的 channel 中,客户端可以通过监听这个 channel 获取到消息,进而实现延时队列的功能。所以删除过期的key不一定是过期的时间。:Redisson的延时队列可以在分布式环境中使用,并提供了分布式锁和协调机制,确保多个节点或实例之间的任务处理的一致性和可靠性。:Redisson的延时队列支持异步任务处理,减少了等待时间和阻塞,提升了整体的吞吐量和响应性能。,查询头部元素,如果过期,使用ZREM移除。

qq_24510649的博客 955

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ScheduledThreadPoolExecutor核心原理与高可用实践

定时任务是中后台系统的基础能力,其底层依赖JUC并发包中的调度线程池机制。ScheduledThreadPoolExecutor并非简单封装,而是融合了最小堆延迟队列、Leader-Follower唤醒模型与任务生命周期管理的精密调度引擎。它解决了Timer单线程阻塞、Executors工厂方法参数不可控等典型缺陷,在电商对账、IoT心跳、日志归档等高并发长周期场景中承担关键调度职责。理解DelayedWorkQueue的堆排序逻辑与scheduleAtFixedRate/scheduleWithFixed

weixin_34005090的博客 279

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

工作总结:异步消息处理,插入数据与查询数据解决方案

在我目前的项目中,接口调用通过MQ收发json报文消息来执行接口的调用,遇到了个问题,就是在发消息之前落地的数据需要在接收消息之后调用的接口中需要再次查询,于是出现了一个问题,查询时查不到那条数据,分析原因:接收消息后的查询动作,因为网络延迟等原因,在数据库数据落地之前进行,于是造成了落地与查询的顺序颠倒。 解决方案:收到消息后延时调用接口(无法根本解决此问题),但是还是提一下。 添加依赖: ...

崋崽的博客 1430

java ScheduledExecutorService 线程池定时延迟执行

ScheduledExecutorService

qq_39994174的博客 1024

Java延时消息的实现

Java延时消息的实现

果酱 の 博客 6383

6.5.4 java预定义线程池ScheduledThreadPoolExecutor 理解、使用示例

目录 两个构造方法 有两种类型 构造理解 适用场景 周期线程池执行的常用方法 使用demo1:newSingleThreadScheduledExecutor的顺序执行 schedule:延时3秒执行 scheduleAtFixedRate:固定时间间隔执行任务 scheduleWithFixedDelay:然后执行完任务后,延迟3秒再周期执行当前任务 如果不了解线程池的各个参数的含义,可以查看此文章线程池的优点、以及各个参数的意义、使用示例 两个构造方法 一个多了一个线程工厂的..

一点光辉的博客 718

React-Native执行react-native run-android出错

React-Native执行react-native run-android出错,报错如下 Looks like you installed react-native globally, maybe you meant react-native-cli? To fix the issue, run: npm uninstall -g react-native npm install -g react-native-cli 执行npm run android 也出错 执行: npm inst..

FigSprite的博客 562

ScheduledThreadPoolExecutor源码解读(二)

null, triggerTime(initialDelay, unit), //重点! 传入的delay取反了,用delay正负来区分执行间隔是否固定 unit.toNanos(-delay)); //将任务包装成RunnableScheduledFuture对象 //decorateTask直接返回sft,这个函数的意图是让开发者DIY继承实现的 RunnableScheduledFuture t = decorateTask(command, sft); sft.outerTask = t; //延迟

m0_69745415的博客 540

java线程知识点

线程 线程 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target 3.通过实现Callable接口和FutureTask创建线程 Callable callable = new Callable() { @Override public Object call() throws Exception { return null; } }; FutureTask futureTask = new F

qq_44086060的博客 32万+

JUC并发编程 共享模式之工具 ThreadPoolExecutor -- 任务调度线程池 定时任务 / 延时执行(ScheduledThreadPoolExecutor 延时执行 / 定时执行)

1. 任务调度线程池 1.1 ScheduledThreadPoolExecutor 延时执行 示例代码(任务都延时1s执行): package com.tian; import java.util.Date; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; impor

天行健 君子以自强不息,地势坤 君子以厚德载物。 1343

JUC:ScheduledThreadPoolExecutor 延迟任务线程池的使用

timer也可以进行延迟运行,但是会有很多问题。 可以看出通过控制线程数可以解决timer的缺点。同时出现异常也不会影响其他任务运行。

Cosmoshhhyyy的博客 461

实战:10 种实现延迟任务的方法,附代码!

您好,我是路人,更多优质文章见个人博客:http://itsoku.com接下来的内容一定不会让你失望,因为它将是目前市面上最好的关于“延迟任务”的文章,好了,话不多说,直接进入今天的主题,本文的主要内容如下图所示:什么是延迟任务? 顾明思议,我们把需要延迟执行的任务叫做延迟任务。延迟任务的使用场景有以下这些:红包 24 小时未被查收,需要延迟执退还业务;每个月账单日,需要给用户发送当月的对账单;...

路人甲Java 2880
上一篇: 使用 DelayQueue做延时消息处理
下一篇: 使用Hutool的SystemTimer做延时消息处理
pywanggui
博客等级 码龄12年 6粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pywanggui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值