Java中的SynchronousQueue示例–生产者使用者解决方案

SynchronousQueue是BlockingQueue的一种特殊类型,其中每个插入操作必须等待另一个线程进行相应的删除操作,反之亦然。 当您在SynchronousQueue上调用put()方法时,它将阻塞,直到有另一个线程将该元素从Queue中取出为止。 同样,如果一个线程尝试删除一个元素并且当前不存在任何元素,则该线程将被阻塞,直到另一个线程将一个元素放入队列中为止。 您可以将SynchronousQueue与运行奥运火炬的运动员( 线程 )相关联,使他们运行火炬(需要传递对象)并将其传递给在另一端等待的其他运动员。 如果您注意该名称,您还将了解到它被命名为SynchronousQueue是有原因的,它将数据同步传递到其他线程。 它等待对方获取数据,而不仅仅是放入数据并返回(异步操作)。 如果您熟悉CSP和Ada,那么您就会知道同步队列类似于集合通道。 它们非常适合切换设计,在该设计中,在一个线程中运行的对象必须与在另一个线程中运行的对象同步,以便向其传递一些信息,事件或任务。 在早期的多线程教程中,我们学习了如何使用wait and notify和BlockingQueue解决生产者消费者问题,在本教程中,我们将学习如何使用同步队列来实现生产者消费者设计模式 。 此类还支持用于订购等待的生产者和使用者线程的可选公平性策略。 默认情况下,不保证此排序。 但是,将Fairness属性设置为true构造的队列将按FIFO顺序授予线程访问权限。

使用Java中的SynchronousQueue的生产者使用者解决方案 正如我之前说过的,没有什么比生产者使用者问题更好地理解任何编程语言中的线程间通信了。 在生产者使用者问题中,一个线程充当产生事件或任务的生产者,而另一个线程充当使用者。 共享缓冲区用于将数据从生产者传输到消费者。 解决生产者使用者问题的困难在于边缘情况,例如,如果缓冲区已满,生产者必须等待,如果缓冲区为空,使用者线程必须等待。 后来一个很容易,因为阻塞队列不仅提供缓冲区来存储数据,而且还提供流控制来阻塞线程,如果缓冲区已满,则调用put()方法(PRODUCER),如果阻塞为空,则阻塞线程将调用take()方法(CONSUMER) 。 在本教程中,我们将使用SynchronousQueue(一种零容量的特殊并发集合)解决相同的问题。

在下面的示例中,我们有两个线程,分别名为PRODUCER和CONSUMER(您应始终命名线程,这是编写并发应用程序的最佳实践之一)。 第一线程,发布板球得分,第二线程正在消耗它。 板球比分不过是一个String对象。 如果您按原样运行程序,则不会发现任何不同。 为了了解SynchronousQueue的工作原理以及如何解决生产者使用者问题 ,您需要在Eclipse中调试该程序,或者只是通过注释consumer.start()来启动生产者线程。 如果使用者线程未运行,则生产者将在以下位置阻塞
队列。 put(event); 通话,您将不会看到[PRODUCER]发布的活动:四个。 发生这种情况是由于 SynchronousQueue,它确保线程插入数据将一直阻塞,直到有线程删除该数据为止,反之亦然。 您可以通过注释生产者来测试代码的另一部分。 开始(); 并且仅启动使用者线程。

import java.util.concurrent.SynchronousQueue;/*** Java Program to solve Producer Consumer problem using SynchronousQueue. A* call to put() will block until there is a corresponding thread to take() that* element.** @author Javin Paul*/
public class SynchronousQueueDemo{public static void main(String args[]) {final SynchronousQueue<String> queue = new SynchronousQueue<String>();Thread producer = new Thread("PRODUCER") {public void run() {String event = "FOUR";try {queue.put(event); // thread will block hereSystem.out.printf("[%s] published event : %s %n", Thread.currentThread().getName(), event);} catch (InterruptedException e) {e.printStackTrace();}}};producer.start(); // starting publisher threadThread consumer = new Thread("CONSUMER") {public void run() {try {String event = queue.take(); // thread will block hereSystem.out.printf("[%s] consumed event : %s %n", Thread.currentThread().getName(), event);} catch (InterruptedException e) {e.printStackTrace();}}};consumer.start(); // starting consumer thread}}Output:
[CONSUMER] consumed event : FOUR 
[PRODUCER] published event : FOUR

如果您仔细发送了输出,那么您会注意到事件的顺序是相反的。 似乎[CONSUMER]线程正在消耗数据,甚至在[PRODUCER]线程产生数据之前。 发生这种情况是因为默认情况下,SynchronousQueue不保证任何顺序,但是它具有公平性策略,如果将其设置为true,则可以按FIFO顺序访问线程。 您可以通过将true传递给SynchronousQueue的重载构造函数 (即新的SynchronousQueue(boolean fair))来启用此公平性策略。

这是Java中此特殊阻塞队列的一些重要属性。 将数据从一个线程同步传输到另一个线程非常有用。 它没有任何容量,只有在另一端有线程时才阻塞。

  1. SynchronousQueue阻塞,直到另一个线程准备好接受该元素,一个线程正在尝试放置该元素。
  2. SynchronousQueue的容量为零。
  3. SynchronousQueue用于实现直接切换的排队策略,在该策略中,线程将切换到等待的线程,否则允许创建新线程,否则拒绝任务。
  4. 此队列不允许使用null元素,添加null元素将导致NullPointerException 。
  5. 出于其他Collection方法(例如contains)的目的,SynchronousQueue充当空集合。
  6. 您无法窥视同步队列,因为仅当您尝试删除它时,该元素才存在。 同样,您不能插入元素(使用任何方法),除非另一个线程试图将其删除。
  7. 您无法在SynchronousQueue上进行迭代,因为没有要进行迭代的内容。
  8. 将公平性策略设置为true构造的SynchronousQueue授予线程按FIFO顺序的访问权限。

这就是Java中的SynchronousQueue 。 我们已经看到了此特殊并发集合的某些特殊属性,并学习了如何使用Java中的SynchronousQueue解决经典的生产者使用者问题。 顺便说一下,队列有点令人困惑,因为它没有任何能力容纳您的元素。 在有一个线程正在调用take()操作之前,对put()操作的调用不会完成。 最好是线程之间共享对象的集合点。 换句话说,它是一个实用程序,可以在Java中的两个线程之间同步共享数据,这可能是更安全的wait和notify方法的替代方法。

翻译自: https://www.javacodegeeks.com/2014/06/synchronousqueue-example-in-java-producer-consumer-solution.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OnSen UI结合AngularJs打造”美团APP我的”页面 --Hybrid App

1、页面效果图&#xff1a; 演示地址&#xff1a;http://www.nxl123.cn/bokeyuan/meiTuanDemo_mine/ 2、核心代码 mine.html&#xff1a; <ons-page id"mine" ng-controller"MineController"> <!--toolbar开始--> <ons-toolbar>…

[MOSS开发]:通过简单BUG跟踪Demo阐述用户控件对列表的操作

下面的文章我想以一个具体的BUG跟踪Demo来说明MOSS的具体应用,这里面会应用到下面的知识点: 1:用户组,用户的创建,权限分配&#xff1b; 2:列表的概念以及创建&#xff1b; 3:利用用户控件来完成表单的增加加功能&#xff1b; 4:当前域用户查看自己BUG。 BUG跟踪软件在一些…

Maven的课堂笔记4

9.Maven与MyEclipse2014结合 MyEclipse10以上的版本,对Maven支持的就比较好 9.2 Myeclipse配置 本地文件夹的C盘的.m2文件夹下必须得有这个settings.xml文件 不配置这个settings.xml文件的话,myeclipse会从互联网上下载需要的jar包. 9.3 修改pom文件 添加jar包 <project xml…

vue动画

vue 提供了一些显示、隐藏一些不同的过渡&#xff0c;效果主要跟 v-if v-show 动态组件 1. vue 给动画分了 6 个过程&#xff0c;在 css 中扮演 6 个类 .v-enter  定义动画的开始状态 .v-enter-active  定义动画生效时的状态 .v-enter-to  定义动画结束是的状态 .v-leave…

图数据库的知识表示与推理

图形数据库及其技术生态系统可以为知识表示和推理问题提供优雅&#xff0c;有效的解决方案。 要了解这种说法&#xff0c;我们必须首先了解什么是图形。 图是一种数据结构。 图数据结构的类型很多&#xff0c;但出于本文的目的&#xff0c;我们将重点介绍一种已被称为属性图的类…

vegas 为盖斯

vegas 为盖斯 S键 分割素材U键 分开视频和音频I键渲染开始O渲染结束 默认布局 为盖斯新建项目的参数 剪好后渲染 插入字幕 转载于:https://www.cnblogs.com/GaoNa/p/10562504.html

COMET彗星(三)构建自己的COMET核心

主题列表&#xff1a; COMET彗星&#xff08;一&#xff09;SERVER PUSH介绍 COMET彗星&#xff08;二&#xff09;基于SERVER PUSH的消息传输 引言&#xff1a; 在上一篇随笔中&#xff0c;对COMET使用的类和作用进行了简短的介绍&#xff0c;从本篇随笔开始&#xff0c;将从实…

如何在JavaServer Pages中使用Salesforce REST API

摘要&#xff1a;本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com &#xff08;同时使用HTTP&#xff08;S&#xff09;和JSON&#xff09;管理您的数据的分步过程。 在此示例中&#xff0c;我将Mac OS X 10.9.…

写在08年“愚人节”

从博客园学了很多东西&#xff0c;是时候该回馈了。谢谢博客园给我们提供这么好的平台交流技术。 刚发了文章习惯性的看了下自己博客的首页代码&#xff0c;感觉日历不够精良。 我做过的一个ajax日历&#xff0c;可以参考解放日报 艺术家具版的日期直达功能的日历&#xff0c;用…

JQuery实现点击按钮切换图片(附源码)--JQuery基础

JQuery实现切换图片相对比较简单&#xff0c;直接贴代码了哈&#xff0c;有注释噢&#xff01;疑问请追加评论哈&#xff0c;不足之处还请大佬们指出&#xff01; 1、案例代码&#xff1a; demo.html&#xff1a; <!DOCTYPE html><html><head>   <me…

CSS3盒子模型

web前端必须了解的CSS3盒子模型 1、需要了解的属性以及属性值 display:box或者display:inline-box box-orient:horizontal | vertical (水平 垂直) 定义盒模型的布局方向 box-direction:normal reverse(正序 反序) 元素排列顺序 box-ordinal-group:number(数值) 设置元素…

与JBoss Fuse,Jenkins和Nexus的持续集成

最近&#xff0c;我正在整理一个快速启动的Maven项目&#xff0c;以展示一种组织JBoss Fuse项目的可行方法。 该项目可在Github上找到&#xff1a; https &#xff1a; //github.com/paoloantinori/fuse_ci 这是我与朋友詹姆斯罗林斯 &#xff08; James Rawlings&#xff09…

html5表单与PHP交互

1、示例代码 前端&#xff1a; <!DOCTYPE html><html><head><meta charset"utf-8"> <title>html5表单与PHP交互</title></head><body><form action"http://localhost/jh.php" method"post"…

【DP】【期望】$P1850$换教室

【DP】【期望】\(P1850\)换教室 链接 题目描述 有 \(2n\) 节课程安排在$ n$ 个时间段上。在第 \(i\)&#xff08;\(1 \leq i \leq n\)&#xff09;个时间段上&#xff0c;两节内容相同的课程同时在不同的地点进行&#xff0c;其中&#xff0c;牛牛预先被安排在教室 \(c_i\)上课…

高并发服务器逻辑处理瓶颈,如何解决?

https://mp.weixin.qq.com/s/GHHHvgURdZpNJ1Ec6RHgPg 高并发衡量指标 响应时间&#xff1a;系统对请求做出响应的时间&#xff0c;即一个http请求返回所用的时间&#xff1b;吞吐量&#xff1a;单位时间内处理的请求数量&#xff1b;QPS&#xff08;TPS&#xff09;&#xff1a…

Java 8 StampedLocks与ReadWriteLocks和同步

同步部分就像访问您的岳父母。 您希望尽可能少出现。 关于锁定&#xff0c;规则是相同的–您想花费最短的时间在关键区域内获取锁定&#xff0c;以防止形成瓶颈。 锁定的核心语言惯用法一直是用于方法和离散块的synced关键字。 这个关键字实际上已硬连接到HotSpot JVM中。 我们…

MSN on 2/16/2009

转载于:https://www.cnblogs.com/zxlin25/archive/2009/02/16/1391207.html

开发微信小程序中SSL协议的申请、证书绑定、TLS 版本处理等

在上篇随笔《基于微信小程序的系统开发准备工作》介绍了开发微信小程序的一些前期的架构设计、技术路线 、工具准备等方面内容&#xff0c;本篇随笔继续这个步骤&#xff0c;逐步介绍我们实际开发过程中对SSL协议的申请及后期处理过程&#xff0c;包括证书的IIS端口绑定&#x…

【面向对象】对比JavaScript、Go、Ada、Python、C++、Java、PHP的访问限制。

在不同编程语言中&#xff0c;控制成员&#xff08;变量、方法、类等&#xff09;可见性的机制不尽相同。以下是对比JavaScript、Go、Ada、Python、C、Java、PHP所使用的访问限制关键字和约定&#xff1a; 一、JavaScript ### JavaScript访问限制 早期的JavaScript并没有类似…

Web API应用架构设计分析(1)

Web API 是一种应用接口框架&#xff0c;它能够构建HTTP服务以支撑更广泛的客户端&#xff08;包括浏览器&#xff0c;手机和平板电脑等移动设备&#xff09;的框架&#xff0c; ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。本文主要以AS…