简单分析及总结BlockingQueue接口下七个常用类
生活随笔
收集整理的这篇文章主要介绍了
简单分析及总结BlockingQueue接口下七个常用类
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
1. BlockingQueue下主要有五个类ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue以及SynchronousQueue。
1.1 ArrayBlockingQueue内部结构还是一个Object数组,只不过相对ArrayList来说,使用了ReentrantLock而已,如下图。
1.2 LinkedBlockingQueue内部是头尾、单向链表,而LinkedList是头尾、双向节点,结果如下图。
1.3 DelayQueue是一个延时阻塞队列,内部结构是优先队列,优先队列根据“延时时间”进行处理。所以,DelayQueue存放的数据都得实现Delayed接口,因此DelayQueue也用上界限定通配符<? extends T>限定了泛型的上界,源码如下。
1.4 PriorityBlockingQueue内部是一个数组,然后通过比较器或者自身实现的Comparable接口的compareTo方法进行小顶堆的排序,最终第一个元素的比较值是最小的。
1.5 SynchronousQueue内部没有存储元素,但是相当于只能存一个数据。当有线程需要数据(消费者)时,会判断产生数据的线程(生产者)是否在等待,有生产者在等待说明“有一个数据”,那么消费者可以和生产者“匹配”,从而消费数据;若没有生产者在等待,说明没有数据,那么消费者陷入等待状态。同理,当生产者要生产数据时,判断是否有消费者,有消费者,那么匹配;若没有则等待。
1.6 LinkedBlockingDeque实现了BlockingDeque,而BlockingDeque继承于BlockingQueue。LinkedBlockingDeque相对于LinkedBlockingQueue来说,只是节点变为了双向而已,如下图。
1.7 LInkedTransferQueue实现了TranferQueue接口,而TranfersQueue接口继承于BlockingQueue。相当于SynchronousQueue和LinkedBlockingQueue的结合,相对于SynchronousQueue,多了一个可以储存的队列,相对于LinkedBlockingQueue,又可以直接传递元素。内部结构是链表,节点Node结构如下图。
LinkedTransferQueue大致的实现逻辑和原理:生产者和消费者通过传入不同的变量值,标识自身“身份”,然后和队列的head节点身份比较。对于消费者,判断head节点是否是数据,如果是,那么直接取走数据;如果不是则将消费者作为节点添加至尾部。对于生产者,判断head节点是否是数据,如果head不是数据,那么生产者数据给head节点消费;如果head是数据,那么将生产者作为节点放置尾部。
与50位技术专家面对面20年技术见证,附赠技术全景图
总结
以上是生活随笔为你收集整理的简单分析及总结BlockingQueue接口下七个常用类的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 集合之TreeMap源码分析,简单介绍什
- 下一篇: Concurrent包下的常用并发类和普