`
不平凡的人
  • 浏览: 35454 次
  • 性别: Icon_minigender_1
  • 来自: 嘉峪关
社区版块
存档分类
最新评论

DelayQueue延迟阻塞队列

 
阅读更多

1、DelayQueue:

      带有延迟时间的Queue,其中的元素只有当其指定了延迟时间到了,才能够从队列中获取元素。DelayQueue中的元素必须实现Delay接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时的数据进行移除、任务超时处理、空闲连接关闭等。

 

2、示例如下:

package net.oschina.tkj.mulitcoding.blockqueue.delayqueue;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * 网民,放入延迟的时间队列 DelayQueue里面,元素要实现Delayed接口
 * 
 * @author Freedom
 * 
 */
public class NetPerson implements Delayed {

	private final int id; // 身份证
	private final String name;
	private final long endTime;

	public NetPerson(int id, String name, long endTime) {
		this.id = id;
		this.name = name;
		this.endTime = endTime;
	}

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public long getEndTime() {
		return endTime;
	}

	@Override
	public int compareTo(Delayed o) {
		NetPerson p = (NetPerson) o;
		return this.getDelay(TimeUnit.SECONDS) - p.getDelay(TimeUnit.SECONDS) > 0 ? 1
				: -1;
	}

	@Override
	public long getDelay(TimeUnit unit) {
		return endTime - System.currentTimeMillis();
	}

	@Override
	public String toString() {
		return "NetPerson [id=" + id + ", name=" + name + ", endTime="
				+ endTime + "]";
	}

}

 

package net.oschina.tkj.mulitcoding.blockqueue.delayqueue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue;

/**
 * 网吧类,为线程的任务类
 * 
 * @author Freedom
 * 
 */
public class NetBar implements Runnable {

	// 定义一个阻塞的延迟的队列
	private static BlockingQueue<NetPerson> queue = new DelayQueue<>();

	// 登记用户上网的信息
	public void registNetPerson(int id, String name, long money) {
		NetPerson person = new NetPerson(id, name, 1000 * money
				+ System.currentTimeMillis());
		System.out.println("用户:" + person + " 开始上网...");
		queue.add(person);
	}

	/*
	 * 用户下机
	 */
	public void endPlay(NetPerson p) {
		System.out.println("用户:" + p + " 上机时间到了,下机...");
	}

	@Override
	public void run() {
		NetPerson p = null;
		try {
			while (true) {
				p = queue.take();
				endPlay(p);
				Thread.sleep(500);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

	/**
	 * 主函数
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		System.out.println("新的一天,网吧营业开始...");
		NetBar bar = new NetBar();
		Thread t1 = new Thread(bar);
		bar.registNetPerson(411, "张三", 10);
		bar.registNetPerson(342, "李四", 5);
		bar.registNetPerson(675, "王五", 3);

		t1.start();

	}

}

 

分享到:
评论

相关推荐

    java利用delayedQueue实现本地的延迟队列

    DelayQueue 提供了一个无界的阻塞队列,用于存放实现了 Delayed 接口的对象。 DelayQueue 能够保证队列中的对象是有序的,即队头对象的延迟到期时间最长。 DelayQueue 的使用场景非常广泛,如: 1. 订单业务中,...

    JDK自带的延迟队列-DelayQueue

    `DelayQueue`是一个基于优先级队列(PriorityQueue)实现的无界阻塞队列,它的主要特性是元素只有在达到指定延迟时间后才能被消费。这种队列常用于实现定时任务调度、缓存过期策略等场景。 1. **延迟元素的概念** ...

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    5. DelayQueue:一个延迟阻塞队列,元素只有在延迟时间到期后才能出队。 阻塞队列的选择策略: 1. 根据队列的大小选择合适的阻塞队列。 2. 根据元素的类型选择合适的阻塞队列。 3. 根据线程池的需求选择合适的阻塞...

    DelayQueue、Redis结合使延迟、定时任务使用源代码

    `DelayQueue`是Java并发库`java.util.concurrent`中的一个数据结构,它是一个基于优先级队列的无界阻塞队列,可以用于存储具有延迟时间的元素。而Redis则是一个高性能的键值数据库,通过其丰富的数据结构和操作,...

    高效延时队列的设计与实现

    2. 使用JDK自带的DelayQueue:这是一个无界阻塞队列,元素需实现Delayed接口,当延迟时间到达时,元素可以从队列中取出。但这种方式不适用于分布式环境。 3. 消息中间件实现,如RabbitMQ:通过设置消息的存活时间...

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    5. DelayQueue:一个基于PriorityQueue实现的延迟队列,其中的元素只有在过了一定的延迟时间后才能被取走。 6. LinkedTransferQueue和LinkedBlockingDeque:分别为基于链表结构的无界队列,前者提供了多种线程间交换...

    10、阻塞队列BlockingQueue实战及其原理分析.pdf

    4. **DelayQueue**:基于优先级队列实现的无界阻塞队列,主要用于处理延迟过期的对象。 5. **SynchronousQueue**:不存储元素的阻塞队列,每次插入必须等待一次移除,反之亦然。 6. **LinkedTransferQueue**:基于...

    剖析Java中阻塞队列的实现原理及应用场景

    4. **DelayQueue**:基于PriorityQueue,元素需要在指定的延迟时间后才能被获取。它也是无界的,只有在延迟时间到达时,消费者才能取出元素。 阻塞队列和非阻塞队列的主要区别在于处理满队列和空队列的情况。非阻塞...

    Java并发编程(21)并发新特性-阻塞队列和阻塞栈(含代

    4. `DelayQueue`: 一个基于优先级队列的阻塞队列,元素只有在其延迟时间到期后才能被获取。 **阻塞栈(BlockingDeque)** 阻塞栈,即阻塞双端队列(BlockingDeque),在Java中由`LinkedBlockingDeque`实现。它同时...

    一个小的java Demo , 非常适合Java初学者学习阅读.rar

    数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, 链阻塞队列 LinkedBlockingQueue,具有优先级的阻塞队列 PriorityBlockingQueue, 同步队列 SynchronousQueue,阻塞双端队列 BlockingDeque, 链阻塞双端队列 ...

    一口气说出Java 6种延时队列的实现方法(面试官也得服)

    DelayQueue 是一个 BlockingQueue,无界阻塞队列,内部使用的是 PriorityQueue,PriorityQueue 使用完全二叉堆来实现队列元素排序。在向 DelayQueue 队列中添加元素时,会给元素一个 Delay(延迟时间)作为排序条件...

    Java中的阻塞队列详细介绍

    4. **DelayQueue**:无界的阻塞队列,队列中的元素必须实现Delayed接口,以指定元素的延迟时间。只有在延迟时间结束后,元素才能被取出。这使得DelayQueue非常适合用于实现缓存系统或者定时任务调度。 5. **...

    java并发工具包详解

    4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 Synchronou sQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 ...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque ...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10...

    springboot执行延时任务之DelayQueue的使用详解

    DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。它提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素。DelayQueue的元素需要实现Delayed接口,该接口类定义如下: ...

    高级Java人才培训专家-05-延迟队列精准发布文章

    - **原理:** `DelayQueue` 是一个支持延时获取元素的阻塞队列,内部利用优先队列实现。 - **局限性:** 若程序异常中断,`DelayQueue` 中的任务将丢失。 - **2. 使用RabbitMQ实现延迟任务:** - **方案:** 结合消息...

    详解Java阻塞队列(BlockingQueue)的实现原理

    DelayQueue 对元素进行持有直到一个特定的延迟到期。注入其中的元素必须实现java.util.concurrent.Delayed接口。 LinkedBlockingQueue 内部以一个链式结构(链接节点)对其元素进行存储。如果需要的话,这一链式...

Global site tag (gtag.js) - Google Analytics