`

DelayQueue simple

 
阅读更多
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class DelayQueueTest {

	public static void main(String[] args) throws InterruptedException {
		DelayQueue<Customer> q = new DelayQueue<Customer>();
		Customer c1 = new Customer(5, "customer1");
		Customer c2 = new Customer(10, "customer2");
		Customer c3 = new Customer(2, "customer3");
		Customer c4 = new Customer(17, "customer3");
		q.put(c1);
		q.put(c2);
		q.put(c3);
		q.put(c4);

		int count = 1;
		while (true) {
			Thread.sleep(1000);
			Customer c = null;
			// q.take() 则会阻塞
			if (null != (c = q.poll())) {
				System.out.println("c : " + c.getName() + " , time:" + count+ "s");
			} else {
				System.out.println("get object " + c + " , time:" + count + "s");
			}
			count++;
			if (q.isEmpty()) {
				break;
			}
		}
		System.out.println("test finished");
	}

}

class Customer implements Delayed {
	private String name;

	// unit miutes
	private long delayTime;// 需要延时的时间

	public Customer(long delayTime, String name) {
		//当前时间+过期间隔=未来过期时间
		this.delayTime = System.nanoTime()
				+ TimeUnit.SECONDS.toNanos(delayTime);
		this.name = name;
	}

	@Override
	public int compareTo(Delayed o) {
		Customer c = (Customer) o;
		return this.delayTime > c.delayTime ? 1
				: (this.delayTime < c.delayTime ? -1 : 0);
	}

	@Override
	public long getDelay(TimeUnit unit) {
		long sys = System.nanoTime();
		// System.out.println("delayTime : " + delayTime
		// + " ,  System.nanoTime() " + sys);
		long minuts = delayTime - sys;
		return minuts;
	}

	public long getDelayTime() {
		return delayTime;
	}

	public String getName() {
		return name;
	}
}

 

 

 

get object null , time:1s
get object null , time:2s
get object null , time:3s
get object null , time:4s
c : customer1 , time:5s
get object null , time:6s
get object null , time:7s
get object null , time:8s
get object null , time:9s
c : customer2 , time:10s
test finished

 

0
1
分享到:
评论

相关推荐

    DelayQueue

    学习视频,可以丰富java知识。能够获得更多的专业技能

    DelayQueue延迟队列和Redis缓存实现订单自动取消功能

    在Java编程中,DelayQueue是一种特殊的并发队列,它遵循先进先出(FIFO)原则,但具有一个独特的特性:元素只有在其指定的延迟时间过去之后才能被获取和处理。这个特性使得DelayQueue成为实现定时任务和延迟操作的...

    DelayQueue的使用以及注意事项

    DelayQueue的使用以及注意事项,这里需要由BlockingQueue的基本知识,一般的Queue的使用方法poll(),take(),drainTo()和offer(),put()这些应该懂。

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

    本文将深入探讨如何利用Java中的`DelayQueue`和Redis来实现这一功能。`DelayQueue`是Java并发库`java.util.concurrent`中的一个数据结构,它是一个基于优先级队列的无界阻塞队列,可以用于存储具有延迟时间的元素。...

    JDK自带的延迟队列-DelayQueue

    **延迟队列(DelayQueue)详解** 在Java的并发编程中,`DelayQueue`是一个非常特殊的队列,它属于并发包`java.util.concurrent`的一部分。`DelayQueue`是一个基于优先级队列(PriorityQueue)实现的无界阻塞队列,...

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

    Spring Boot延时任务之DelayQueue的使用详解 DelayQueue是一个无界阻塞队列,只有在延迟期满时,才能从中提取元素。它提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素。DelayQueue的元素...

    Java多线程并发开发之DelayQueue使用示例

    "Java多线程并发开发之DelayQueue使用示例" DelayQueue是Java多线程并发开发中的一种常用的数据结构,它是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象。DelayQueue的主要作用是按照对象的延迟时间...

    基于DelayQueue的简单的定时任务队列.zip

    基于DelayQueue的简单的定时任务队列.zip Quick Start class Main { public static void main(String[] args) { // 初始化任务队列 JobScheduler scheduler = new JobScheduler("default"); // 向队列中提交任务...

    delay-queue:JDK实现的本地delayQueue和基于分布式Redis的两种分布式

    local delayQueue implemented by JDK & two kinds of distributed delayQueue based redis 1. 基本介绍 RedisSynDelayQueue 基于redis,并发情况下会加分布式锁,单线程场景(syn=false)性能较好, 并发场景性能较...

    基于SpringBoot的延迟消息Starter设计源码,支持DelayQueue、Redisson、RabbitMQ三种方式

    该项目是SpringBoot框架下的延迟消息Starter,提供对DelayQueue、Redisson和RabbitMQ三种延迟消息机制的集成支持。项目包含32个文件,涵盖24个Java源文件、4个XML配置文件、1个Git忽略文件、1个Markdown文件、1个...

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

    DelayQueue&lt;Task&gt; queue = new DelayQueue(); ``` 我们可以将 Task 对象添加到 DelayQueue 中,并使用.take()方法来获取队头对象,并执行对应的任务。 ``` queue.put(new Task(30 * 1000, new Runnable() { ...

    java.util.concurrent_您不知道的5件事

    ### Java.util.concurrent_您不知道的5件事 #### 1. Semaphore(信号量) - **定义与作用**:`Semaphore` 类是一种控制多个线程访问共享资源的机制,它通过内部维护一个整数计数器(许可的数量)以及一组等待线程...

    Java企业版中性能调节的最佳实践.pdf

    ### Java企业版中性能调节的最佳实践 #### 一、引言 在当今高度竞争的商业环境中,企业级应用系统的性能优化至关重要。一个高效稳定的系统不仅能提高用户体验,还能降低运营成本,提升企业的竞争力。...

    php-delayqueue:基于redis实现高可用,易拓展,接入方便,生产环境稳定运行的延迟队列

    延迟队列,顾名思义它是一种带有延迟功能的消息队列。 那么,是在什么场景下我才需要这样的队列呢? 一、背景 先看看一下业务场景: 1.会员过期前3天发送召回通知 2.订单支付成功后,5分钟后检测下游环节是否都正常...

    Delayed interface and Delay Queue

    标题 "Delayed interface and Delay Queue" 涉及到Java并发编程中的两个重要概念:Delayed接口和DelayQueue。这篇博文可能是作者Tomboxfan在iteye博客上分享关于这两个概念的深入理解和应用实例。 Delayed接口是...

    redis实现简单队列

    Redis 是一个高性能的键值数据库,它支持多种数据结构,如字符串、哈希、列表、集合和有序集合。在本文中,我们将重点关注 Redis 如何实现简单队列,并通过使用 StackExchange.Redis C# 客户端进行操作。...

    高效的实现队列

    在IT行业中,队列是一种非常基础且重要的数据结构,它遵循先进先出(FIFO,First In First Out)的原则。本篇文章将详细讲解如何高效地实现队列,并结合提供的文件"Quene"来探讨可能的实现方式。...

    Go-delay-queue基于Redis实现的延迟队列

    在IT行业中,延迟队列是一种特殊的消息队列,它允许我们设定消息在特定时间后才被消费,这对于处理定时任务、订单超时、通知发送等场景非常有用。本项目是基于Go语言和Redis实现的延迟队列,借鉴了有赞(Zan)的设计...

    定时任务与线程池:并发编程的关键

    重点介绍了ScheduledThreadPoolExecutor的内部工作机制,如何使用DelayQueue来存储等待执行的任务。DelayQueue内部实现了一个基于时间优先级的PriorityQueue,保证任务能按计划时间顺序执行。文档还详细描述了任务...

    JAVA并发容器代码随读1

    不同的并发容器根据其设计目的和应用场景,采用不同的实现方式,如 BlockingQueue 的阻塞等待、DelayQueue 的延迟处理、ConcurrentMap 的分段锁、以及 CopyOnWrite 系列的写时复制。理解和掌握这些并发容器的原理和...

Global site tag (gtag.js) - Google Analytics