`
punishzhou
  • 浏览: 142925 次
社区版块
存档分类
最新评论

Java 的DelayQueue

 
阅读更多

今天看了一下HBase的代码,发现在很多地方都用了DelayQueue,网上有很多解析DelayQueue的实例

 

http://www.cnblogs.com/jobs/archive/2007/04/27/730255.html

 

提到了DelayQueue的使用场景:

 

a) 关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。
b) 缓存。缓存中的对象,超过了空闲时间,需要从缓存中移出。
c) 任务超时处理。在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求。

一种笨笨的办法就是,使用一个后台线程,遍历所有对象,挨个检查。这种笨笨的办法简单好用,但是对象数量过多时,可能存在性能问题,检查间隔时间不好设置,间隔时间过大,影响精确度,过小则存在效率问题。而且做不到按超时的时间顺序处理。

这场景,使用DelayQueue最适合了。

DelayQueue是一个BlockingQueue,其特化的参数是Delayed。Delayed扩展了Comparable接口,比较的基准为延时的时间值,Delayed接口的实现类getDelay的返回值应为固定值(final)。DelayQueue内部是使用PriorityQueue实现的。

DelayQueue = BlockingQueue + PriorityQueue + Delayed

DelayQueue的关键元素BlockingQueue、PriorityQueue、Delayed。可以这么说,DelayQueue是一个使用优先队列(PriorityQueue)实现的BlockingQueue,优先队列的比较基准值是时间。

http://guji.is-programmer.com/posts/24751.html详细介绍了delayQueue的用法和原理

Delayed是一个无界的阻塞队列.不允许将NULL放入其中. 它的并发是使用了ReentrantLock和对应的一个condition来完成. 其外,DelayQueue的队列头部放置的是延迟期满了最久的一个元素. 如果元素的getDelay()方法返回0或者小于0的时候才能将其出列. DelayQueue中的元素都是实现了Delayed接口,在JDK中, 而Delayed接口继承了Comparable, 在使用DelayQueue之前就需要自己编写一个Delayed的实现类,

 public long getDelay(TimeUnit unit) {
            long d = unit.convert(time - now(), TimeUnit.NANOSECONDS);
            return d;
        }

now()函数的实现:
 private static final long NANO_ORIGIN = System.nanoTime();

    /**
     * Returns nanosecond time offset by origin
     */
    final long now() {
        return System.nanoTime() - NANO_ORIGIN;
    }
public int compareTo(Delayed other) {
            if (other == this) // compare zero ONLY if same object
                return 0;
         
          long d = (getDelay(TimeUnit.NANOSECONDS) -
                      other.getDelay(TimeUnit.NANOSECONDS));
            return (d == 0)? 0 : ((d < 0)? -1 : 1);
        }
有几个重要的方法:

take();取队列首元素,若无,则阻塞直至

poll(timeout);取队列首元素,若超过timeout时间仍没有,返回失败

 

在Hbase中,Lease就是以一个DelayQueue存放的。

 

比如说一个当client scan Table的时候,首先会找到scan的startkey所在的Region,构建RegionScanner,将通过RegionScanner加入一个delayqueue,以及维护一个scannerId到Regionscanner的map。HRegionserver启动的时候会起一个Leases的守护线程,时刻监听delayqueue的元素,当有过期时将其从map中移除,从而达到Leases的作用

分享到:
评论
1 楼 di1984HIT 2014-10-11  
写的很好偶~~~~~

相关推荐

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

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

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

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

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

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

    DelayQueue

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

    分布式环境下限流方案的实现redis RateLimiter Guava,Token Bucket, Leaky Bucket1

    2. **Java DelayQueue**:使用延迟队列来限制请求的处理速度。但这需要额外的队列管理,并且可能无法实现精确的限流,同时可能会增加系统的复杂性。 3. **Redis限流**:通过Redis存储计时器和计数器,每次请求时...

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

    DelayedQueue 的实现是基于 Java 中的阻塞队列的接口 BlockingQueue, DelayQueue 是其的一种实现。 DelayQueue 提供了一个无界的阻塞队列,用于存放实现了 Delayed 接口的对象。 DelayQueue 能够保证队列中的对象...

    JDK自带的延迟队列-DelayQueue

    在Java的并发编程中,`DelayQueue`是一个非常特殊的队列,它属于并发包`java.util.concurrent`的一部分。`DelayQueue`是一个基于优先级队列(PriorityQueue)实现的无界阻塞队列,它的主要特性是元素只有在达到指定...

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

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

    免费开源-【Java学习+面试指南】部分内容大部分是Java程序员所需要掌握的核心知识

    ArrayList核心源码+扩容机制分析LinkedList核心源码分析HashMap核心源码+底层数据结构分析ConcurrentHashMap核心源码+底层数据结构分析...核心源码分析PriorityQueue核心源码分析DelayQueue核心源码分析

    史上最全的延迟任务实现方式汇总!附代码(强烈推荐)

    DelayQueue&lt;DelayedTask&gt; queue = new DelayQueue(); queue.offer(new DelayedTask(3000)); // 延迟3秒的任务 while (!queue.isEmpty()) { DelayedTask task = queue.take(); task.execute(); // 执行任务 } ``` ...

    java实现一个小程序语句的延迟执行的小demo

    首先,Java提供了多种方式来实现延迟执行,例如使用`java.util.Timer`类、`java.util.concurrent.DelayQueue`或者`java.util.concurrent.ScheduledExecutorService`。这里我们将重点讨论`ScheduledExecutorService`...

    java concurrent 精简源码

    Java并发库中实现阻塞队列的主要类有ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue和DelayQueue等。它们在并发编程中起到缓冲和协调生产者与消费者线程的作用,实现高效的数据交换。 3. **线程...

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

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

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

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

    java并发工具包 java.util.concurrent中文版pdf

    - **DelayQueue**:持有延迟到期的对象的无界阻塞队列。 - **LinkedBlockingQueue**:基于链表的有界/无界阻塞队列。 - **PriorityBlockingQueue**:基于优先级的无界阻塞队列。 - **SynchronousQueue**:不存储元素...

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

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

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

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

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics