package com.bjsxt.base.coll013; import java.util.Iterator; import java.util.concurrent.DelayQueue; /** * @author Administrator *DelayQueue: 带有延迟时间的Queue,其中元素只有当指定时间到了,才能从队列中取该元素。 DelayQueue中的对象必须实现Delayed接口,没有限制大小,应用场景很多, 比如,对缓存超时的数据进行移除,任务超时处理、空闲连接关闭等等。 */ public class WangBa implements Runnable { private static DelayQueue<Wangmin> queue = new DelayQueue<Wangmin>(); public boolean yinye =true; public void shangji(String name,String id,int money){ Wangmin man = new Wangmin(name, id, 1000 * money + System.currentTimeMillis()); System.out.println("网名"+man.getName()+" 身份证"+man.getId()+"交钱"+money+"块,开始上机..."); this.queue.add(man); } public void xiaji(Wangmin man){ System.out.println("网名"+man.getName()+" 身份证"+man.getId()+"时间到下机..."); System.out.println("剩下:"+queue.size()+" 鞋同"); } @Override public void run() { while(yinye){ try { Wangmin man = queue.take(); xiaji(man); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String args[]){ try{ System.out.println("网吧开始营业"); WangBa siyu = new WangBa(); Thread shangwang = new Thread(siyu); shangwang.start(); siyu.shangji("路人甲", "123", 1); siyu.shangji("路人乙", "234", 10); siyu.shangji("路人丙", "345", 5); } catch(Exception e){ e.printStackTrace(); } } }
package com.bjsxt.base.coll013; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; public class Wangmin implements Delayed { private String name; //身份证 private String id; //截止时间 private long endTime; //定义时间工具类 private TimeUnit timeUnit = TimeUnit.SECONDS; public Wangmin(String name,String id,long endTime){ this.name=name; this.id=id; this.endTime = endTime; } public String getName(){ return this.name; } public String getId(){ return this.id; } /** * 用来判断是否到了截止时间 */ @Override public long getDelay(TimeUnit unit) { //return unit.convert(endTime, TimeUnit.MILLISECONDS) - unit.convert(System.currentTimeMillis(), TimeUnit.MILLISECONDS); return endTime - System.currentTimeMillis(); } /** * 相互批较排序用 */ @Override public int compareTo(Delayed delayed) { Wangmin w = (Wangmin)delayed; return this.getDelay(this.timeUnit) - w.getDelay(this.timeUnit) > 0 ? 1:0; } }
相关推荐
在Java编程中,DelayQueue是一种特殊的并发队列,它遵循先进先出(FIFO)原则,但具有一个独特的特性:元素只有在其指定的延迟时间过去之后才能被获取和处理。这个特性使得DelayQueue成为实现定时任务和延迟操作的...
DelayQueue 提供了一个无界的阻塞队列,用于存放实现了 Delayed 接口的对象。 DelayQueue 能够保证队列中的对象是有序的,即队头对象的延迟到期时间最长。 DelayQueue 的使用场景非常广泛,如: 1. 订单业务中,...
**延迟队列(DelayQueue)详解** 在Java的并发编程中,`DelayQueue`是一个非常特殊的队列,它属于并发包`java.util.concurrent`的一部分。`DelayQueue`是一个基于优先级队列(PriorityQueue)实现的无界阻塞队列,...
在向 DelayQueue 队列中添加元素时,会给元素一个 Delay(延迟时间)作为排序条件,队列中最小的元素会优先放在队首。队列中的元素只有到了 Delay 时间才允许从队列中取出。 2. ScheduledExecutorService 延时队列 ...
基于DelayQueue的简单的定时任务队列.zip Quick Start class Main { public static void main(String[] args) { // 初始化任务队列 JobScheduler scheduler = new JobScheduler("default"); // 向队列中提交任务...
`DelayQueue`是Java并发库`java.util.concurrent`中的一个数据结构,它是一个基于优先级队列的无界阻塞队列,可以用于存储具有延迟时间的元素。而Redis则是一个高性能的键值数据库,通过其丰富的数据结构和操作,...
在IT行业中,队列是一种非常基础且重要的数据结构,它遵循先进先出(FIFO,First In First Out)的原则。本篇文章将详细讲解如何高效地实现队列,并结合提供的文件"Quene"来探讨可能的实现方式。 首先,我们要理解...
在IT行业中,延迟队列是一种特殊的消息队列,它允许我们设定消息在特定时间后才被消费,这对于处理定时任务、订单超时、通知发送等场景非常有用。本项目是基于Go语言和Redis实现的延迟队列,借鉴了有赞(Zan)的设计...
整个延迟队列由4个部分组成: 1. JobPool用来存放所有Job的元信息。 2. DelayBucket是一组以时间为维度的有序队列,用来存放所有需要延迟的Job(这里只存放Job Id)。 3. Timer负责实时扫描各个Bucket,并将delay...
2. 使用JDK自带的DelayQueue:这是一个无界阻塞队列,元素需实现Delayed接口,当延迟时间到达时,元素可以从队列中取出。但这种方式不适用于分布式环境。 3. 消息中间件实现,如RabbitMQ:通过设置消息的存活时间...
DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。它提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素。DelayQueue的元素需要实现Delayed接口,该接口类定义如下: ...
DelayQueue还可以用于实现生产者消费者模式,生产者将对象放入队列中,而消费者则从队列中取出对象进行处理。 DelayQueue的缺点 DelayQueue的缺点是如果队列中的对象非常多,可能会导致性能下降。同时,如果...
5. DelayQueue:一个延迟阻塞队列,元素只有在延迟时间到期后才能出队。 阻塞队列的选择策略: 1. 根据队列的大小选择合适的阻塞队列。 2. 根据元素的类型选择合适的阻塞队列。 3. 根据线程池的需求选择合适的阻塞...
5. DelayQueue:一个基于PriorityQueue实现的延迟队列,其中的元素只有在过了一定的延迟时间后才能被取走。 6. LinkedTransferQueue和LinkedBlockingDeque:分别为基于链表结构的无界队列,前者提供了多种线程间交换...
例如,Java中的Timer和DelayQueue,可以实现简单的延迟任务。但这种方法一般适用于单机场景,因为它难以应对分布式系统中的复杂环境。 2. 基于数据库的解决方案:在这种方案中,将待处理的任务以记录的形式存储在...
延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢? 一、背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节是否都正常...
阻塞队列在Java并发包java.util.concurrent中提供了多种实现,如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、DelayQueue和SynchronousQueue等,每种阻塞队列都根据其特性适用于不同的场景。...
4. **DelayQueue**:基于优先级队列实现的无界阻塞队列,主要用于处理延迟过期的对象。 5. **SynchronousQueue**:不存储元素的阻塞队列,每次插入必须等待一次移除,反之亦然。 6. **LinkedTransferQueue**:基于...
在Java中,`DelayQueue`是一个无界阻塞队列,用于存储实现了`Delayed`接口的元素。`Delayed`接口要求元素能够提供一个延迟时间,`DelayQueue`在取出元素时会检查是否已达到延迟时间。然而,原生的`DelayQueue`并不...
`BlockingQueue`还提供了`TransferQueue`和`DelayQueue`两个子接口,分别用于支持异步传输和延迟生产元素的队列。 9. **性能优化** 使用`BlockingQueue`可以减少锁的使用,降低锁竞争,从而提高多线程环境下的...