博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[JAVA学习笔记-88]DelayQueue实现Leader-Follower pattern
阅读量:4098 次
发布时间:2019-05-25

本文共 2105 字,大约阅读时间需要 7 分钟。

DelayQueue实现Leader-Folloer pattern
1、当存在多个take线程时,同时只生效一个,即,leader线程
2、当leader存在时,其它的take线程均为follower,其等待是通过condition实现的
3、当leader不存在时,当前线程即成为leader,在delay之后,将leader角色释放还原
4、最后如果队列还有内容,且leader空缺,则调用一次condition的signal,唤醒挂起的take线程,其中之一将成为新的leader
5、最后在finally中释放锁
/**     * Retrieves and removes the head of this queue, waiting if necessary     * until an element with an expired delay is available on this queue.     *     * @return the head of this queue     * @throws InterruptedException {@inheritDoc}     */    public E take() throws InterruptedException {        final ReentrantLock lock = this.lock;        lock.lockInterruptibly();        try {            for (;;) {                E first = q.peek();                if (first == null)                    available.await();   /*队列为空则让当前线程在condition available上等待*/                else {                    long delay = first.getDelay(TimeUnit.NANOSECONDS);                    if (delay <= 0)      /*超时时间已到,直接从队列中取出元素,线程返回。*/                        return q.poll();                    else if (leader != null)   /*超时时间未到,且leader不为空(有线程正在处理),则当前调用线程在condition available上等待*/                        available.await();                    else {                        Thread thisThread = Thread.currentThread();                        leader = thisThread;    /*超时时间未到,且leader为空,则当前调用线程成为leader线程,leader是DelayQueue的private成员*/                        try {	                            available.awaitNanos(delay);	/*leader线程在condition available挂起直到超时时间满足,leader线程释放锁(atomically release the associated lock)*/                        } finally {							/*使用try finally保证finally中的语句务必执行*/                            if (leader == thisThread)	   /*问题:finally是在线程唤醒,重新竞争到锁,然后从 awaitNanos 继续执行,最后执行到finally*/                                leader = null;                        }                    }                }            }        } finally {            if (leader == null && q.peek() != null)   /*队列中有数据,且leader为空,则需要唤醒一下condition available等待队列上的线程,重新竞争锁,然后从挂起处继续执行*/                available.signal();            lock.unlock();    /*最后释放锁*/        }    }

转载地址:http://kvhii.baihongyu.com/

你可能感兴趣的文章
全网首发:阿里云面试真题公开,想面阿里,按照这样做准备
查看>>
一篇文章吃透Java多线程编程核心技术,敢于直面面试官多线程问题
查看>>
开发五年,如何在一年内从13k到大厂30k,全靠这份《java面试宝典》!
查看>>
深入P8级别JAVA底层知识:你知道阿里P8需要掌握哪些技术吗?
查看>>
Java基础知识点总结
查看>>
Java的新未来:逐渐“Kotlin化”
查看>>
Java反射是什么?看这篇绝对会了!
查看>>
京东T9用一份900页SpringBoot笔记让你像搭积木一样构建系统架构
查看>>
目前开发中爆火的Java、Go和Rust间的比较!
查看>>
Java语言新特性?封印类
查看>>
MySQL深度解析,基础+高级篇数据库教程-从入门到入坟
查看>>
全网最全SpringBoot干货知识总结(超详细,建议收藏)
查看>>
同事牛逼啊,写了个隐藏 bug,我排查了 3 天才解决问题
查看>>
凭借这份文档,阿里Java岗四面直接定级P8,面经面试题分享
查看>>
Spring Boot在微服务中的最佳实践
查看>>
请把 .gitattributes 加到你的 Git 仓库中
查看>>
太赞了!美团T9终于整理出Java架构之完美设计实战开源文档
查看>>
一篇文章让你了解基于Spring的测试
查看>>
10个微服务架构设计的最佳实践
查看>>
分布式ID生成策略,我和面试官掰扯了一个小时
查看>>