当前位置: 首页 > news >正文

【Java】DelayQueue

一,概述

本文简单介绍下延迟队列,顾名思义,加入队列的元素具备延时出队的特征,在诸如延迟消息时可简单使用,本文笔者以学习心态简单介绍下此数据结构。

DelayQueue实现类图如下

DelayQueue实现Queue接口,内部保存一个优先级队列,新加入队列的元素必须实现Delay接口,实现getDelay和compareTo方法,以满足优先级队列排序,以及出队延迟计算。

二,实例

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;public class DelayQueueMain {public static void main(String[] args) throws InterruptedException {DelayQueue<Message> queue = new DelayQueue<>();//创建一个消费者线程new Thread(() -> {try {System.out.println("Consumer Thread Create.");while (true) {Message message = queue.take();message.action.run();}} catch (InterruptedException e) {throw new RuntimeException(e);}}).start();//生产者for (int i = 0; i < 10; i++) {Message message = new Message((10 - i) * 200, i);queue.add(message);Thread.sleep(100);}}private static class Message implements Delayed {private final long createTime;private final long delayMs;private final long id;private final Runnable action = new Runnable() {@Overridepublic void run() {//简单demo,打印id即可System.out.println("invoke Message Id=" + id + ", DelayMs=" + delayMs);}};public Message(long delayMs, long id) {this.id = id;this.delayMs = delayMs;this.createTime = System.currentTimeMillis();}@Overridepublic long getDelay(TimeUnit unit) {return this.createTime + this.delayMs - System.currentTimeMillis();}@Overridepublic int compareTo(Delayed o) {long selfDelay = getDelay(TimeUnit.MILLISECONDS);long otherDelay = o.getDelay(TimeUnit.MILLISECONDS);if (selfDelay == otherDelay) {return 0;}return selfDelay > otherDelay ? 1 : -1;}}
}

输出如下

从上述结果可知,生产者加入队列的延迟消息,在消费者处如预期输出。

三,原理

优先级队列中,存放的元素实现了Delayed接口,通过getDelay可判断元素的优先级,delay小的优先在队列前端。

生产者offer

很简单,往队列中放一个元素,如果为空,则通过condition通知到消费者

消费者take

1,队列为空,通过condition等待

2,3,获得优先级队列第一个元素,并且计算当前getDelay值,小于0则出队,跳出for循环,否则继续超时await

相关文章:

  • 5.27 day 30
  • 修改SpringBootApplication类的入参后,引用外部yml的启动命令要修改
  • Spring AI 本地Ollama
  • C++ 中的函数包装:std::bind()、std::function<>、函数指针与 Lambda
  • 一个开源的多播放源自动采集在线影视网站
  • 15.进程间通信(一)
  • c++复习_第一天(引用+小众考点)
  • 2025吉林CCPC 题解(前六题)
  • 【NLP基础知识系列课程-Tokenizer的前世今生第四课】生物信息中的 Tokenizer 策略:如何切开一段基因?
  • 【NLP基础知识系列课程-Tokenizer的前世今生第五课】从静态到可学:Tokenizer 的自适应演化之路
  • C/C++的OpenCV的锐化
  • ojs导入显示空白页错误信息
  • Ubuntu 下搭建ESP32 ESP-IDF开发环境,并在windows下用VSCode通过SSH登录Ubuntu开发ESP32应用
  • 【android bluetooth 协议分析 02】【bluetooth hal 层详解 6】【高通蓝牙hal主要流程介绍-下】
  • Jmeter一些元件使用的详细记录
  • 详解MYSQL索引失效问题排查
  • 如何描述BUG
  • ubuntu22.04 安装 SecureCRT8.7.3
  • 5.0.7 TabControl的使用
  • Java+Playwright自动化-2-环境准备与搭建-基于Maven
  • 石狮外贸网站建设公司报价/关键词搜索排行榜
  • 商城网站建设自助建站平台/百度百度一下一下
  • 做的最少的网站/整站seo定制
  • 佛山市城市建设工程有限公司/北京整站线上推广优化
  • 做写真网站合法吗/网站内容编辑
  • 珠海建设工程监督站网站/谷歌浏览器下载手机版安卓官网