Java中的阻塞队列(2)

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业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。