当前位置:网站首页 > 人工智能与大数据应用 > 正文

阻塞队列的应用场景(阻塞队列的使用场景)



这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

前面我们写了延时队列,今天我们来唠唠SynchronousQueue,Sync,也叫同步队列。我还给他起了另外一个名字叫“配对”队列,具体为什么叫“配对”队列,下面我们具体说明

多说一句,欢迎大家点击头像查看专题,设计模式专题已完结,目前正在进行的是队列专题和Security专题。

阻塞队列可分为以下几种:

image.png

阻塞队列(Blocking Queue)提供了可阻塞的 put 和 take 方法,它们与可定时的 offer 和 poll 是等价的。如果队列满了 put 方法会被阻塞等到有空间可用再将元素插入;如果队列是空的,那么take 方法也会阻塞,直到有元素可用。当队列永远不会被充满时,put 方法和 take 方法就永远不会阻塞。

SynchronousQueue,实际上它不是一个真正的队列,因为SynchronousQueue没有容量。与其他BlockingQueue(阻塞队列)不同,SynchronousQueue是一个不存储元素的BlockingQueue。只是它维护一组线程,这些线程在等待着把元素加入或移出队列。

我们简单分为以下几种特点:

  • 内部没有存储(容量为0)
  • 阻塞队列(也是blockingqueue的一个实现)
  • 发送或者消费线程会阻塞,只有有一对消费和发送线程匹配上,才同时退出。
  • 配对有公平模式和非公平模式(默认)

为了演示我们上面所分析的特么 下面根据实例代码演示下:

 
  

看下控制台打印

 
  

看到没,这个就是开头所说“配对”队列,也就是验证了入和出必须是配对的。否则阻塞。

所以说这是一个很有意思的阻塞队列,其中每个插入操作必须等待另一个线程的移除操作,同样任何一个移除操作都等待另一个线程的插入操作。因此此队列内部其 实没有任何一个元素,因此不能调用peek操作,因为只有移除元素时才有元素。

我们接下来看下它的应用场景

我们拿newCachedThreadPool线程池来了解下

 
  

SynchronousQueue的一个使用场景是在线程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue,这个线程池根据需要(新任务到来时)创建新的线程,如果有空闲线程则会重复使用,线程空闲了60秒后会被回收。

由于ThreadPoolExecutor内部实现任务提交的时候调用的是工作队列(BlockingQueue接口的实现类)的非阻塞式入队列方法(offer方法),因此,在使用SynchronousQueue作为工作队列的前提下,客户端代码向线程池提交任务时,而线程池中又没有空闲的线程能够从SynchronousQueue队列实例中取一个任务,那么相应的offer方法调用就会失败(即任务没有被存入工作队列)。

此时,ThreadPoolExecutor会新建一个新的工作者线程用于对这个入队列失败的任务进行处理(假设此时线程池的大小还未达到其最大线程池大小)。

是不是设计的贼精彩。我们可以去里面跟一下代码

开头说过,SynchronousQueue 与其他BlockingQueue一样,SynchronousQueue同样继承AbstractQueue和实现BlockingQueue接口:

image.png

SynchronousQueue提供了两个构造函数:

image.png

 
  

TransferQueue、TransferStack继承Transferer,Transferer为SynchronousQueue的内部类,它提供了一个方法transfer(),该方法定义了转移数据的规范,如下:

 
  

transfer()方法主要用来完成转移数据的,如果e != null,相当于将一个数据交给消费者,如果e == null,则相当于从一个生产者接收一个消费者交出的数据。

好的 今天的同步队列SynchronousQueue 就先讲到这里,我们简单做下总结

使用SynchronousQueue的目的就是保证“对于提交的任务,如果有空闲线程,则使用空闲线程来处理;否则新建一个线程来处理任务”。

SynchronousQueue也是blockingqueue的一个实现,内部采用的就是ArrayBlockingQueue的阻塞原语,所以在功能上完全可以用ArrayBlockingQueue替换之,但是SynchronousQueue 是轻量级的,SynchronousQueue 不具有任何内部容量,甚至不具有一的容量,我们可以用来在线程间安全的交换单一元素。所以功能比较单一,优势应该就在于轻量吧~

好的 关于队列的学习我们下期再见,加油!!!

感谢你的阅读,如果你感觉学到了东西,您可以点赞,关注。也欢迎有问题我们下面评论交流

加油! 我们下期再见!

给大家分享几个我前面写的几篇骚操作

copy对象,这个操作有点骚!

干货!SpringBoot利用监听事件,实现异步操作

也欢迎点击下面队列专题进行关注。我们一起学习

到此这篇阻塞队列的应用场景(阻塞队列的使用场景)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 小米手机数据迁移到华为新手机不能迁移应用么(小米旧手机数据迁移到华为新手机)2025-06-20 23:09:07
  • 环形队列有什么应用场景(环形队列有什么应用场景和特点)2025-06-20 23:09:07
  • 快应用中心是个什么软件(快应用中心是什么软件有什么用)2025-06-20 23:09:07
  • ddpm模型代码(ddm模型的应用)2025-06-20 23:09:07
  • 快程序应用中心(快应用中心是什么软件可以卸载吗)2025-06-20 23:09:07
  • 一级某出版社的编辑小刘手中有一篇有关财务软件应用的书稿"会计电算化节节高升.docx",打开该文档,按下列要求帮助小刘对书稿进行排版操作并按原文件名进行保存:1. 按下列要求进行页面设置:纸张大小16开,对称页边距,上边距2.5厘米、下边距2厘米,内侧边距2.5厘米、外侧边距2厘米,装订线1厘米,页脚距边界1.0厘米。2.2025-06-20 23:09:07
  • 单片机应用设计大赛(单片机应用创新设计大赛)2025-06-20 23:09:07
  • 什么叫pass平台(pass应用平台)2025-06-20 23:09:07
  • max232程序(max1232应用)2025-06-20 23:09:07
  • 单片机设计原理技术手册pdf(单片机原理与应用设计pdf)2025-06-20 23:09:07
  • 全屏图片