task-DelayQueue-订单超时实例(task任务,DelayQueue阻塞队列)

Java DelayQueue实战:从订单超时到延时任务调度 延时任务调度是分布式系统中处理定时业务逻辑的核心技术之一,其原理是通过队列或时间轮等数据结构管理任务的执行时间。在Java并发编程中,DelayQueue作为java.util.concurrent包提供的高效延时队列,实现了基于内存的精准任务调度机制。该技术通过Delayed接口定义时间契约,结合优先级队列与Leader-Follower模式优化线程协作,显著降低了传统数据库轮询带来的性能开销。在工程实践中,DelayQueue特别适用于订单超时关闭、缓存过期清理、消息重试等需要高时效性的业务场景。本文以 阅读详情
很早就对task,queue有兴趣,今天总结一下,做个笔记。

一、对于多任务异步的项目中,task的作用很普遍,最近学习,和小试牛刀了一下,有一些感悟,做个笔记。
二、使用spring task,配置如下:

<bean id="orderTimeoutService"
        class="com.haohao.order.service.order.impl.OrderTimeoutServiceImpl"
        init-method="init" destroy-method="destroy">
        <property name="handlers">
            <map key-type="com.haohao.order.common.enums.TimeoutTypeEnum">
                <entry key="ORDER" value-ref="orderTimeoutHandler" />
                <entry key="REFUND" value-ref="refundTimeoutHandler" />
            </map>
        </property>
        <property name="loadTimeoutTask" value="${timeout.task.is.load}"/>
    </bean>

    <bean id="orderTimeoutHandler"
        class="com.haohao.order.service.timeout.handler.OrderTimeoutHandler">
        <property name="timeoutActions">
            <map>
                <entry key="wait_buyer_pay_deposit" value-ref="closeOrderAction" />
                <entry key="wait_buyer_pay_all" value-ref="closeOrderAction" />
                <entry key="wait_seller_send" value-ref="sellerSendGoodsAction" />
                <entry key="wait_buyer_receive" value-ref="receiveGoodsAction" />
            </map>
        </property>
    </bean>

    <bean id="refundTimeoutHandler"
        class="com.haohao.order.service.timeout.handler.RefundTimeoutHandler">
        <property name="timeoutActions">
            <map>
                <entry key="wait_seller_agree" value-ref="confirmRefundProtocolAction" />
                <entry key="wait_buyer_modify" value-ref="closeRefundAction" />
                <entry key="wait_buyer_send" value-ref="closeRefundAction" />
                <entry key="wait_seller_receive" value-ref="refundAction" />
                <entry key="wait_customer_service" value-ref="refundCustomerServiceAction" />
            </map>
        </property>
    </bean>

<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="orderTimeoutService" method="loadRecentlyTimeoutInfo"   cron="${load.order.timeout.period}" />
</task:scheduled-tasks>

    <task:scheduler id="myScheduler" pool-size="5" />

Java代码:

/**
 * 
 */
package com.haohao.order.service.order.impl;

import java.util.List;
import java.util.Map;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.annotation.PreDestroy;
import javax.annotation.Resource;

import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.haohao.order.common.enums.TimeoutTypeEnum;
import com.haohao.order.common.util.BeanUtils;
import com.haohao.order.dal.timeout.OrderTimeoutInfoDAO;
import com.haohao.order.dal.timeout.OrderTimeoutInfoDO;
import com.haohao.order.service.order.OrderTimeoutService;
import com.haohao.order.service.timeout.handler.TimeoutHandler;
import com.haohao.order.service.timeout.model.TimeoutModel;

/**
 * 功能描述:
 * 
 * @author mandy.hu
 */

public class OrderTimeoutServiceImpl implements OrderTimeoutService {
    private static final Logger logger = LoggerFactory.getLogger(OrderTimeoutServiceImpl.class);

    @Resource
    private OrderTimeoutInfoDAO orderTimeoutInfoDAO;

    private DelayQueue<TimeoutModel> timeoutQueue;
    @Autowired(required = false)
    private ExecutorService executorService;
    private Map<TimeoutTypeEnum, TimeoutHandler> handlers;
    private transient boolean running;

    private boolean isLoadTimeoutTask;

    protected void init() {
        if(isLoadTimeoutTask) {
            logger.info("初始化超时队列");
            running = true;
            //初始化一个阻塞队列
            timeoutQueue = new DelayQueue<TimeoutModel>();

            startHandler();
        }
    }
    //这个方法就是用来处理业务的,意思是查询超时的订单,并放在DelayQueue中。
    @Override
    public void loadRecentlyTimeoutInfo() {
        if(isLoadTimeoutTask) {
            logger.info("加载即将超时的信息...");

            List<OrderTimeoutInfoDO> orderTimeoutInfoDOs = orderTimeoutInfoDAO.queryRecentlyOrderTimeoutInfos();

            logger.info("加载即将超时的信息...loadRecentlyTimeoutInfo  orderTimeoutInfoDOs:{}",orderTimeoutInfoDOs);

            List<TimeoutModel> timeoutModels = BeanUtils.convertList(orderTimeoutInfoDOs, TimeoutModel.class);

            if (CollectionUtils.isNotEmpty(timeoutModels)) {
                timeoutQueue.addAll(timeoutModels);
            }
            logger.info("加载即将超时的信息...loadRecentlyTimeoutInfo timeoutQueue:{}",timeoutQueue);
        }
    }

    @PreDestroy
    protected void destroy() {
        running = false;
    }

    private void startHandler() {
        logger.info("启动超时监听线程");

        new Thread(new Runnable() {

            @Override
            public void run() {
                while (running) {
                    try {
                    //阻塞队列执行take()方法,删除队列顶部的一个对象,并返回删除的对象。这个方法是阻塞方法,如果队列中没有对象,这个线程将被阻塞,知道队列中有对象。
                        TimeoutModel timeoutModel = timeoutQueue.take();
//对象交给ExecutorService处理,ExecutorService是一个异步处理机制,相当于一个线程池,意思就把这个take()的对象委托给ExecutorService处理。
                        getExecutorService().execute(new TimeoutHandlerTask(timeoutModel));
                    } catch (InterruptedException e) {
                        logger.warn("处理超时失败", e);
                        e.printStackTrace();
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    class TimeoutHandlerTask implements Runnable {
        private TimeoutModel timeoutModel;

        public TimeoutHandlerTask(TimeoutModel timeoutModel) {
            this.timeoutModel = timeoutModel;
        }

        @Override
        public void run() {
            TimeoutHandler handler = handlers.get(timeoutModel.getTimeoutType());

            if (handler != null) {
                handler.onTimeout(timeoutModel);
            }
        }

    }

    public ExecutorService getExecutorService() {
        if (executorService == null) {
        //得到executorService 对象,其中Runtime.getRuntime()相当于new一个对象,、、Executors.newFixedThreadPool(xxx)最大执行多少个线程的executorService 。
            executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2);
        }

        return executorService;
    }

    public void setExecutorService(ExecutorService executorService) {
        this.executorService = executorService;
    }

    public Map<TimeoutTypeEnum, TimeoutHandler> getHandlers() {
        return handlers;
    }

    public void setHandlers(Map<TimeoutTypeEnum, TimeoutHandler> handlers) {
        this.handlers = handlers;
    }

    public void setLoadTimeoutTask(boolean isLoadTimeoutTask) {
        this.isLoadTimeoutTask = isLoadTimeoutTask;
    }

}

三:上面注释已经很清楚了,为了防止以后不认识自己写注释,在这里再系统的说一下流程。

  1. 在spring配置文件中,配置task。
<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="orderTimeoutService" method="loadRecentlyTimeoutInfo"  cron="${load.order.timeout.period}" />
    </task:scheduled-tasks>

<task:scheduler id="myScheduler" pool-size="5" />

其中ref=”orderTimeoutService”是要执行的类,method=”loadRecentlyTimeoutInfo”是要执行这个类中的方法,cron=”${load.order.timeout.period}” 是执行规则多长时间执行,什么周期执行,都可以灵活设置。

  1. 配置执行的类:
<bean id="orderTimeoutService"
        class="com.haohao.order.service.order.impl.OrderTimeoutServiceImpl"
        init-method="init" destroy-method="destroy">
        <property name="handlers">
            <map key-type="com.haohao.order.common.enums.TimeoutTypeEnum">
                <entry key="ORDER" value-ref="orderTimeoutHandler" />
                <entry key="REFUND" value-ref="refundTimeoutHandler" />
            </map>
        </property>
        <property name="loadTimeoutTask" value="${timeout.task.is.load}"/>
    </bean>

    <bean id="orderTimeoutHandler"
        class="com.haohao.order.service.timeout.handler.OrderTimeoutHandler">
        <property name="timeoutActions">
            <map>
                <entry key="wait_buyer_pay_deposit" value-ref="closeOrderAction" />
                <entry key="wait_buyer_pay_all" value-ref="closeOrderAction" />
                <entry key="wait_seller_send" value-ref="sellerSendGoodsAction" />
                <entry key="wait_buyer_receive" value-ref="receiveGoodsAction" />
            </map>
        </property>
    </bean>

    <bean id="refundTimeoutHandler"
        class="com.haohao.order.service.timeout.handler.RefundTimeoutHandler">
        <property name="timeoutActions">
            <map>
                <entry key="wait_seller_agree" value-ref="confirmRefundProtocolAction" />
                <entry key="wait_buyer_modify" value-ref="closeRefundAction" />
                <entry key="wait_buyer_send" value-ref="closeRefundAction" />
                <entry key="wait_seller_receive" value-ref="refundAction" />
                <entry key="wait_customer_service" value-ref="refundCustomerServiceAction" />
            </map>
        </property>
    </bean>

OrderTimeoutServiceImpl类中有两个方法init-method=”init” destroy-method=”destroy”,一个是这个类加载时就会执行的,另一个是这个类销毁时执行的,init-method方法做一些初始化操作。在这个类中有一个属性,是一个map,名字是handlers,handlers中有初始化了两个对象,本文重点不是这里,就不多赘述了

  1. 看看这一个类的具体实现,首先是初始化方法。
protected void init() {
        if(isLoadTimeoutTask) {
            logger.info("初始化超时队列");
            running = true;
            timeoutQueue = new DelayQueue<TimeoutModel>();

            startHandler();
        }
    }

这个方法很简单就是new一个阻塞队列DelayQueue。之后执行startHandler()方法,

private void startHandler() {
        logger.info("启动超时监听线程");

        new Thread(new Runnable() {

            @Override
            public void run() {
                while (running) {
                    try {
                        TimeoutModel timeoutModel = timeoutQueue.take();

                        getExecutorService().execute(new TimeoutHandlerTask(timeoutModel));
                    } catch (InterruptedException e) {
                        logger.warn("处理超时失败", e);
                        e.printStackTrace();
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

这个方法目的是开起监听,利用的是DelayQueue阻塞队列的特性,方法中调用take()方法,这个方法是阻塞的方法,意思是移除队列中顶部的对象,并返回这个对象,如果队列是空,就会一直等待,等待队列中有对象,线程也处于阻塞的状态,同事就起到了监听的作用。getExecutorService().execute(new TimeoutHandlerTask(timeoutModel))这个方法是把timeoutModel 对象委托给ExecutorService()处理,这边好处理下一个任务。

public ExecutorService getExecutorService() {
        if (executorService == null) {
            executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2);
        }

        return executorService;
    }

这个就是得到ExecutorService对象, ExecutorService是一个异步处理机制,Executors.newFixedThreadPool(Num);最大能处理Num个线程的ExecutorService。调用ExecutorService的execute()方法就是委托了。

public void loadRecentlyTimeoutInfo() {
        if(isLoadTimeoutTask) {
            logger.info("加载即将超时的信息...");

            List<OrderTimeoutInfoDO> orderTimeoutInfoDOs = orderTimeoutInfoDAO.queryRecentlyOrderTimeoutInfos();

            logger.info("加载即将超时的信息...loadRecentlyTimeoutInfo  orderTimeoutInfoDOs:{}",orderTimeoutInfoDOs);

            List<TimeoutModel> timeoutModels = BeanUtils.convertList(orderTimeoutInfoDOs, TimeoutModel.class);

            if (CollectionUtils.isNotEmpty(timeoutModels)) {
                timeoutQueue.addAll(timeoutModels);
            }
            logger.info("加载即将超时的信息...loadRecentlyTimeoutInfo timeoutQueue:{}",timeoutQueue);
        }
    }

这个方法就是在spring task中配置要执行的方法,刚开始的时候一直在想在哪里有数据放在了DelayQueue中,就是这里,将想要监听的数据放在DelayQueue中,在startHandler()方法中就能监听到,这是task就是一个闭环了。

Java DelayQueue:高效处理延时任务的原理、实践与避坑指南 在并发编程和任务调度领域,延时任务处理是一个常见需求,例如订单超时关单、缓存刷新和消息重试。其核心原理在于如何高效、精准地管理大量在未来特定时间点触发的任务,避免低效的轮询机制。Java并发包中的DelayQueue组件,正是为此场景设计的利器。它内部基于优先级队列(PriorityQueue)和条件等待机制,实现了任务按延迟时间有序出队,消费者线程能自动阻塞直到首个任务到期,从而在单机内存环境下,以事件驱动的方式实现了高精度、低开销的延时调度。从技术价值看,DelayQueue提供了一种在易用性、性能和精 阅读详情

相关推荐

二、基于C语言的JPEG解码代码详解

// JPEG解码 // 输入JPEG后输出Bitmap #include <stdio.h> #include <stdlib.h> #pragma warning(disable : 4996) unsigned int BuffIndex; // JPEG数据的位置 unsigned int BuffSize; // JPEG数据的大小 unsigned int BuffX; // 图像的横向尺寸 unsigned int BuffY; //

m0_37633745的博客 4455

Java DelayQueue实战:从订单超时到延时队列的设计与避坑指南

延时队列是一种用于处理延时任务的核心数据结构,其原理是将任务按到期时间排序,实现“按需触发,到期执行”。相比传统的定时轮询,它能显著降低资源消耗,提供毫秒级精度,在电商、缓存、会话管理等场景中具有重要技术价值。Java内置的DelayQueue正是实现这一模式的利器,它基于优先级队列和Delayed接口,提供了线程安全的无界阻塞队列。在实际应用中,结合订单超时等典型场景,开发者需关注内存持久化、集群部署、时间精度等工程实践问题,并规避任务状态可变、消费者线程阻塞等常见陷阱,从而构建出高效可靠的延时任务处理系

weixin_33769125的博客 437

3D缺陷检测实战:从点云处理到工业质检优化

本文深入探讨了3D缺陷检测在工业质检中的实战应用,详细阐述了从点云处理到深度学习模型部署的完整技术链路。文章通过PCB焊点检测等实际案例,分析了3D视觉相比2D检测在识别深度、形状等缺陷方面的优势,并分享了点云滤波、分割、特征提取以及利用YOLOv5等模型进行高效检测的优化心得与落地挑战。

weixin_28358083的博客 337

Java定时器任务3种实现方式(可用于解决过期、超时等需求)

定时任务在实际的开发中特别常见,比如电商平台 30 分钟后自动取消未支付的订单,以及凌晨的数据汇总和备份等,都需要借助定时任务来实现,那么我们本文就来看一下定时任务最简单的几种实现方式。 TOP 1:Timer Timer 是 JDK 自带的定时任务执行类,无论任何项目都可以直接使用 Timer 来实现定时任务,所以 Timer 的优点就是使用方便,它的实现代码如下: public class MyTimerTask { public static void main(String[] ar

Bummon的学习随笔 8802

LoFTR训练避坑指南:从零到一复现论文训练流程

本文是一份详细的LoFTR模型训练避坑指南,旨在帮助开发者从零开始复现论文训练流程。文章系统性地讲解了环境配置、数据准备、代码调试与显存优化等关键步骤,并针对常见的训练错误提供了解决方案,确保训练过程顺利进行。

weixin_29091837的博客 204

语言随机效应模型_线性混合效应模型 VS 方差分析

线性混合效应模型相比方差分析具有很多优点。为了让大家更直观的了解,我们来做一下两者的对比。基于模拟的方法,生成了以下数据dat_sim:这种数据格式是长格式,也就是从实验软件导出来的那种数据格式。这种数据格式可以直接使用线性混合效应模型进行分析。该实验设计是被试内项目间的单因素两水平设计。category是自变量,两个水平分别是outgroup和ingroup,outgroup比ingr...

weixin_31960565的博客 2688

使用 ThreadPoolExecutor 和 DelayQueue 实现订单超时处理

使用 ThreadPoolExecutor 和 DelayQueue 实现订单超时处理

Julius_777的博客 411

基于51单片机的多功能智能路灯控制系统(仿真+代码+原理图)

智能路灯控制系统主要由51单片机最小系统+1602显示模块+DS1302时钟模块+光强检测模块+按键输入模块+声光报警模块+LED照明模块+状态检测电路+人体车辆红外检测模块组成。能实现以下功能: 1.能够按键设定系统时间、工作时间、光照阈值 2.工作时间内路灯点亮,凌晨12点后路灯关闭,有人或车通过是,路灯点亮10s 3.非工作时间光照强度低于阈值,路灯点亮 4.能够检测系统工作状态,路灯应亮未亮,声光报警 5.具备手动控制,能够切换自动/手动控制功能

u012759563的博客 8177

mysql支付成功订单数超过10_1.超时未支付订单处理

1.超时未支付订单处理1.1 需求分析超过限定时间并未支付的订单,我们需要进行超时订单的处理:先调用微信支付api,查询该订单的支付状态。如果未支付调用关闭订单的api,并修改订单状态为已关闭,并回滚库存数。如果该订单已经支付,则做补偿操作(修改订单状态和记录)。1.2 实现思路如何获取超过限定时间的订单?我们可以使用延迟消息队列(死信队列)来实现。所谓延迟消息队列,就是消息的生产者发送的消息并不...

weixin_36321633的博客 844

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 445

写出GD32L233/235在读写flash的区别(用于OTA功能)

在单片机里面表示 大概是 address += sizeof(uint32_t) address += sizeof(uint64_t)1.说到OTA功能,实际上 往flash 指定区域写 数据, 拷贝数据,然后 跳转, 必要时 注意单片机的偏移量。在写本文时,L233支持单字写入,而L235只有双字写入. 一个写入地址+4 一个写入地址+8。这个是 自己写的擦除一页 数据,当然可以参考 提供的demo去实现,看自己需求。接下来是 读取 双字,也就是在L235上的读取。

teleger的博客 907

Spring延迟队列DelayQueue

DelayQueue 中存放的元素必须实现 Delayed 接口,并且需要重写 getDelay()方法(计算是否到期)。它是 BlockingQueue 的一种,底层是一个基于 PriorityQueue 实现的一个无界队列,是线程安全的。此处做一个死循环线程,轮询检查拉取队列数据。

优快云博客技术,java高级工程师,业务层架构师,高级管理认证,毕业设计可以联系我 1118

配置 SAP Fiori 服务的 ICF 节点:从 SICF 激活到访问链路打通的完整实践

在SAP Fiori项目实施中,ICF节点配置是关键前置条件却常被忽视。ICF(Internet Communication Framework)作为HTTP请求入口,需要通过SICF事务码激活相关服务节点,否则即使应用开发完善,用户仍可能遇到页面无法访问等问题。典型问题表现为:磁贴可点击但页面空白、资源加载失败等。激活路径主要涉及三组节点:bsp分支下的管理入口、ui5_ui5分支下的应用资源,以及public/bc下的公共资源。项目实施中需特别注意同名服务在不同分支下的差异化作用,确保完整链路通畅。IC

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 264

SpringTask实现定时任务

本文主要讲解mall整合SpringTask的过程,以批量修改超时订单为例。

豪华的博客 706

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Java】多线程和高并发编程(四):阻塞队列(下)DelayQueue、SynchronousQueue

DelayQueue就是一个延迟队列,生产者写入一个消息,这个消息还有直接被消费的延迟时间。需要让消息具有延迟的特性。DelayQueue也是基于二叉堆结构实现的,甚至本事就是基于PriorityQueue实现的功能。二叉堆结构每次获取的是栈顶的数据,需要让DelayQueue中的数据,在比较时,跟根据延迟时间做比较,剩余时间最短的要放在栈顶。// 发现DelayQueue中的元素,需要继承Delayed接口。// 接口继承了Comparable,这样就具备了比较的能力。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java并发基础:DelayQueue全面解析!

DelayQueue类专为处理延迟任务设计,它允许开发者将任务与指定的延迟时间关联,并在任务到期时自动处理,从而避免了不必要的轮询和资源浪费,此外,DelayQueue内部基于优先队列实现,确保最先到期的任务总是优先被处理,使得任务调度更为高效和精准。

科技互联网领域深度探索者,乐于分享与写作。 1660

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

其他阻塞队列DelayQueue&PriorityBlockQueue延迟阻塞队列和优先级阻塞队列

1. DelayQueue延迟阻塞队列。     该队列主要作用是延迟添加元素,mQueue,put(Delay) 2.DelayQueue实例        由于添加到DelayQueue的item延迟10s,所以调用take方法时候需要等待10秒才可以获取到,否则一直block阻塞状态。    DelayQueue mQueue = new DelayQueue(); //添

wenhuaiteng的专栏 656

DelayQueue介绍

DelayQueue就是一个延迟队列,生产者写入一个消息,这个消息还有直接被消费的延迟时间。需要让消息具有延迟的特性。DelayQueue也是基于二叉堆结构实现的,甚至本事就是基于PriorityQueue实现的功能。二叉堆结构每次获取的是栈顶的数据,需要让DelayQueue中的数据,在比较时,跟根据延迟时间做比较,剩余时间最短的要放在栈顶。// 发现DelayQueue中的元素,需要继承Delayed接口。// 接口继承了Comparable,这样就具备了比较的能力。

qq_45309297的博客 619

科普文:JUC系列之Java中7种阻塞队列DelayQueue用法

DelayQueue采用支持优先级的PriorityQueue来实现,但是队列中的元素必须要实现Delayed接口,Delayed接口用来标记那些应该在给定延迟时间之后执行的对象,该接口提供了getDelay()方法返回元素节点的剩余时间。列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。1.缓存系统的设计:缓存是有一定的时效性的,可以用DelayQueue保存缓存的有效期,然后利用一个线程查询DelayQueue,如果取到元素就证明该缓存已经失效了。

为无为,事无事,味无味。 435

Java延迟队列 DelayQueue讲解

延迟队列 DelayQueue讲解

weixin_45503079的博客 1685

《DelayQueue:Java界的“延时大师”》

好了,今天的介绍就到这里。记住,DelayQueue就像是Java界的“延时大师”,它能让你的任务在预定的时间自动执行。下次当你需要在未来某个时间点执行任务时,不妨召唤DelayQueue,让它帮你管理时间。下次见,继续我们的编程冒险!⏰💻😄。

龚小帅的博客 1090

Java DelayQueue 延迟队列

DelayQueue是 Java 并发包()中的一个无界阻塞队列,用于存储实现了Delayed接口的元素。队列中的元素只有在达到指定的延迟时间后才能被获取。DelayQueue是基于优先级队列的小顶堆实现的阻塞队列。元素需实现Delayed接口,getDelay()返回剩余时间。适用于延迟任务调度、缓存过期管理、订单超时等场景。主要优点是线程安全、自动延迟控制,缺点是无法主动获取未到期元素。可用 ScheduledThreadPoolExecutor。

宋发元 2007

多线程基础(六、四)BlockingQueue用法详解之DelayQueue

多线程基础(六、三)BlockingQueue用法详解之DelayQueue

m0_47743175的博客 368

面试侃集合 | DelayQueue篇

面试官:好久不见啊,上次我们聊完了PriorityBlockingQueue,今天我们再来聊聊和它相关的DelayQueue吧。 Hydra:就知道你前面肯定给我挖了坑,DelayQueue也是一个无界阻塞队列,但是和之前我们聊的其他队列不同,不是所有类型的元素都能够放进去,只有实现了Delayed接口的对象才能放进队列。Delayed对象具有一个过期时间,只有在到达这个到期时间后才能从队列中取出。 面试官:有点意思,那么它有什么使用场景呢? Hydra:不得不说,由于DelayQueue的精妙设计,

275

DelayQueue 的 常用场景及使用示例

DelayQueue是 Java 并发包中的另一个特殊类型的阻塞队列,它用于存放实现了Delayed接口的元素,并且这些元素在指定的延迟时间到期之前不能从队列中获取。这使得DelayQueue。

CAUC_lin的博客 1058

三大延时任务用到的JDK(DelayQueue)、redis、rabbitMQ优缺点

在开发中,往往会遇到一些关于延时任务的需求。三大延时JDK(DelayQueue)、redis、rabbitMQ优缺点。`

weixin_45836587的博客 1472
上一篇: 底层DAO中,使用泛型是 怎么得到传进来 累的真是类型
下一篇: 最近使用频率较高的linux命令
Codegeek_jfl
博客等级 码龄11年 13粉丝 38原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值