BlockingQueue之DelayQueue的学习使用

DelayQueue 是一中阻塞队列,需要实现接口Delayed定义的方法.做下使用记录和心得吧,


@Datapublic class DelayQueueExample implements Delayed {

private String beginTime;    private String name;

public static DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");    public  LocalDateTime localDateTime;

public DelayQueueExample(String beginTime, String name) {        this.beginTime = beginTime ;        this.name = name;    }

@Override    public long getDelay(TimeUnit unit) {

// TimeUnit.NANOSECONDS.convert(1000,TimeUnit.DAYS);        //long ss= unit.convert(afterTime - System.nanoTime(), TimeUnit.MILLISECONDS);       // System.out.println("getDelay()"+ss);       //unit.convert(afterTime - System.nanoTime(), TimeUnit.MILLISECONDS)

//与当前时间对比,小于当前时间的话就进入队列,否则就抛弃这个队列的数据        localDateTime=  LocalDateTime.parse(beginTime,dateTimeFormatter);        return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli()- System.currentTimeMillis();//是否小于当前时间

}

@Override    public int compareTo(Delayed o) {        int temp = (int) (o.getDelay(TimeUnit.MILLISECONDS) - this.getDelay(TimeUnit.MILLISECONDS));        if (temp < 0) {            return 1;        }else {            return -1;        }       // return (int) (o.getDelay(TimeUnit.MILLISECONDS) - this.getDelay(TimeUnit.MILLISECONDS));    }

@Override    public String toString() {        return "DelayQueueExample{" +                "beginTime=" +(beginTime) +                ", name=‘" + name + ‘\‘‘ +                ‘}‘;    }

public static void main(String[] args) throws InterruptedException {        DelayQueue<DelayQueueExample> delayQueue = new DelayQueue<DelayQueueExample>();        delayQueue.add(new DelayQueueExample("2018-06-18 00:45:00", "hhe100"));        delayQueue.add(new DelayQueueExample("2018-06-18 00:47:00", "hhe101"));        delayQueue.add(new DelayQueueExample("2018-06-08 00:46:00", "hhe102"));        new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    DelayQueueExample element = null;                    try {                        element = delayQueue.poll();                        if (element == null) {                            break;                        } else {                            System.out.println(element);                        }                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }        }).start();

}}

源码部分:取值的逻辑相似

 public E poll() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            E first = q.peek();
            if (first == null || first.getDelay(NANOSECONDS) > 0)//丢掉延迟大于0的队列值
                return null;
            else
                return q.poll();
        } finally {
            lock.unlock();
        }
    }

超时加排序机制



原文地址:https://www.cnblogs.com/jinjian91/p/9193325.html

时间: 2024-11-12 12:39:19

BlockingQueue之DelayQueue的学习使用的相关文章

多线程-BlockingQueue,Array[Linked]BlockingQueue,DelayQueue,PriorityBlockingQueue,SynchronousQueue

阻塞场景 BlockingQueue阻塞队列,阻塞的情况主要有如下2种: 1. 当队列满了,进行入队操作阻塞 2. 当队列空了,进行出队操作阻塞 阻塞队列主要用在生产者/消费者模式中,下图展示了一个线程生产,一个线程消费的场景: BlockingQueue接口 操作 抛异常 特殊值 阻塞 超时 插入 add(o) offer(o) put(o) offer(o,timeout,unit) 删除 remove(o) poll() take() poll(timeout,unit) 1. 抛出异常:

对于DelayQueue的理解

今天看公司代码,发现里面使用了 DelayQueue,学习以后记录下来: 概念:DelayQueue是一个支持延时获取元素的无界阻塞队列.里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行.也就是说只有在延迟期到时才能够从队列中取元素. 我理解为:延迟队列用于需要延迟处理的场景:比如延迟会话关闭,如果某一会话1分钟后需要关闭,则可以使用延迟队列,再比如:订单超时取消 例子场景:订单超时 public class

集合综述

ObjectThread 线程StringBuffer CollectionHashMap/Hashtable/ConcurrentHashMap/LinkedHashMapLinkedList/ArrayList/CopyOnWriteArrayListVectorTreeMapHashSet/LinkedHashSet ThreadPoolExecutor/Future/FutureTaskBlockingQueue/PriorityBlockingQueue/DelayQueue/Arra

disruptor框架

简介: Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单.业务逻辑处理器完全是运行在内存中,使用事件源驱动方式.业务逻辑处理器的核心是Disruptor. Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作. Disru

Java并非集合

Java并发集合 并发集合实现1 JDK1.5的出现,对于集合并发编程来说,java developer有了更多的选择.不过,在JDK1.5之前,Java也还是提供了一些解决方案. (1)最为简单直接的就是在程序中我们自己对共享变量进行加锁.不过,缺点也显而易见,手动实现线程安全间接增加了程序的复杂度,以及代码出错的概率---例如:线程死锁的产生: (2)我们还可以使用Java集合框架中的Vector.Hashtable实现类,这两个类都是线程安全的.不过,Java已不提倡使用. (3)此外,我

Java集合--线程安全(CopyOnWrite机制)

5 Java并发集合 5.1 引言 在前几章中,我们介绍了Java集合的内容,具体包括ArrayList.HashSet.HashMap.ArrayQueue等实现类. 不知道各位有没有发现,上述集合都有一个共同的特点,那就是线程不安全性,在并发情况下都不能保证数据的一致性.(当然,这个集合必须是共享了,所以才会有数据不一致) 所以,当我们在进行并发任务时候,共享了一个不适用于并发的数据结构,也就是将此数据结构变成了程序中的成员变量,那么我们将会遇到数据的不一致,进而影响到我们程序的运行. 为了

[转载] java多线程学习-java.util.concurrent详解(四) BlockingQueue

转载自http://janeky.iteye.com/blog/770671 --------------------------------------------------------------------------------- 7.BlockingQueue     “支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用.“ 这里我们主要讨论BlockingQueue的最典型实现:LinkedBlockingQueue 和Arra

java.util.concurrent.DelayQueue 源码学习

jdk1.8 DelayQueue,带有延迟元素的线程安全队列,当非阻塞从队列中获取元素时,返回最早达到延迟时间的元素,或空(没有元素达到延迟时间).DelayQueue的泛型参数需要实现Delayed接口,Delayed接口继承了Comparable接口,其内部使用非线程安全的优先队列(PriorityQueue),并使用Leader/Followers模式,最小化不必要的等待时间.DelayQueue不允许包含null元素. Leader/Followers模式,借用其他博客的话来解释下:

BlockingQueue队列学习

今天看了下BlockingQueue的几种实现,记录下以便以后复习. 首先来看一下BlockingQueue的家族成员: BlockingQueue除了先进先出外,还有两个操作:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用.阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程.阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素. 阻塞队列提供了四种处理方法: 方法\处理方式 抛出异常 返回特殊值 一