您现在的位置是:首页 > 文章详情

Java中的阻塞队列(2)

日期:2018-05-28点击:388

6、同步队列SynchronousQueue

    同步队列是一个不存储元素的阻塞队列,每一个put操作必须等待一个take操作,否则就不能继续添加元素。这种场景下可用于多个线程之间的通讯,a线程可以把需要传递的数据放到同步队列中,b线程消费队列中的数据,因为本身不存储元素,所以SynchronousQueue的吞吐量高于ArrayBlockingQueue和LinkedBlockingQueue

    首先看一下结构,从结构上跟别的队列并没有什么太大的区别,所以区别就要看里面的源码了

img_8291605a29e71c4c6eada8feb7ff4478.png
图6-1

    SynchronousQueue队列分为两种模式默认采取的非公平锁,SynchronousQueue不存储元素,所以会有很多的生产者和消费者阻塞,对于这些阻塞的线程,非公平锁中存入了一个LIFO队列中,其实就是把线程放入队列,而不是数据

    当SynchronousQueue构造函数中入口参数改为true,此时队列采取公平锁,阻塞的线程存入一个FIFO队列中

    此处具一个例子

img_a956ea47095083262ddaf3ea9ac6e7bc.png
图6-2
img_675f752914e2a54bf31e50d24a6b6973.png
图6-3

7、LinkedBlockingDeque链表双向阻塞队列

    由链表结构组成的双向阻塞队列,双向队列指的是可以从队列的两端插入和移出元素

8、链表传输队列LinkedTransferQueue

    这个需要重点说一下,首先看一下类组成结构如图8-1

img_5468e2b2b5e26e41744117f5c530221c.png
图8-1

    此处我们单独拿出TransferQueue接口所扩展的方法来看这个传输队列的作用,如图8-2

img_7e90f7605164759d0e03f2924e48675d.png
图8-2

        我们可以看到TransferQueue接口扩展的几个方法:

            1、transfer(E e) :如果目前有消费者阻塞,则直接移交消费者,如果没有,放到队列尾部且生产者进入阻塞,直到数据被消费

            2、tryTransfer(E e):如果目前有消费者阻塞,则直接移交消费者,如果没有,直接返回false,而且数据不进入队列,这个操作不会阻塞线程

            3、tryTransfer(E e,long timeOut,TimeUnit unit):如果目前有消费者阻塞,则直接移交消费者,如果没有,放到队列尾部且生产者进入阻塞,等到消费者来消费,如果指定时间中无法被消费者获取,则直接返回false,同时元素被移除

            4、hasWaitingConsumer():判断有没有等待的消费者

            5、getWaitingConsumerCount():获取目前存在的消费者的数量

    知道了这些,基本就能大概了解到这个实现TransferQueue接口的类大多能做什么了,接下来直接上一个简单的应用

    如图8-3

img_46654208f09cc192e9a45b601d31e856.png
图8-3
img_b6b27858b88fc638d25fa57bf425ae9a.png
图8-4
img_b554c35c3d0ee468c807cb101ec5df3e.png
图8-5
原文链接:https://yq.aliyun.com/articles/652730
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章