2019独角兽企业重金招聘Python工程师标准>>>

一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行peek,因为仅在试图要移除元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方法)插入元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的 是尝试添加到队列中的首个已排队插入线程的元素;如果没有这样的已排队线程,则没有可用于移除的元素并且poll()将会返回null。对于其他Collection方法(例如contains),SynchronousQueue作为一个空 collection。此队列不允许null元素。

同步队列类似于 CSP 和 Ada 中使用的 rendezvous 信道。它非常适合于传递性设计,在这种设计中,在一个线程中运行的对象要将某些信息、事件或任务传递给在另一个线程中运行的对象,它就必须与该对象同步。

对于正在等待的生产者和使用者线程而言,此类支持可选的公平排序策略。默认情况下不保证这种排序。但是,使用公平设置为true所构造的队列可保证线程以 FIFO 的顺序进行访问。

ExecutorService pool = Executors.newCachedThreadPool(); 就是用的SynchronousQueue队列。

package com.lucky.concurrent.queue;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.SynchronousQueue;public class SynchronousQueueTest {private SynchronousQueue<String> queue = new SynchronousQueue<String>();private static class SynchronousQueueWrite implements Runnable {private SynchronousQueue<String> queue;private int i ;SynchronousQueueWrite(SynchronousQueue<String> queue,int i) {this.queue = queue;this.i = i ;}@Overridepublic void run() {try {queue.put(i+"");} catch (InterruptedException e) {e.printStackTrace();}}}private static class SynchronousQueueRead implements Runnable {private SynchronousQueue<String> queue;SynchronousQueueRead(SynchronousQueue<String> queue) {this.queue = queue;}@Overridepublic void run() {try {System.out.println("take: "+queue.take());} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {new SynchronousQueueTest().run();}public void run() {ExecutorService pool = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {pool.execute(new SynchronousQueueWrite(queue,i));pool.execute(new SynchronousQueueRead(queue));System.out.println("queue size: "+queue.size());}pool.shutdown();}
}

运行结果:

查看运行结果:queue大小一直是0。
注意事项:
 注意1:它一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。 同步队列没有任何内部容量,甚至连一个队列的容量都没有。
 注意2:它是线程安全的,是阻塞的。
 注意3:不允许使用 null 元素。
 注意4:公平排序策略是指调用put的线程之间,或take的线程之间。
 公平排序策略可以查考ArrayBlockingQueue中的公平策略。
 注意5:SynchronousQueue的以下方法很有趣:
    * iterator() 永远返回空,因为里面没东西。
    * peek() 永远返回null。
    * put() 往queue放进去一个element以后就一直wait直到有其他thread进来把这个element取走。
    * offer() 往queue里放一个element后立即返回,如果碰巧这个element被另一个thread取走了,offer方法返回true,认为offer成功;否则返回false。
    * offer(2000, TimeUnit.SECONDS) 往queue里放一个element但是等待指定的时间后才返回,返回的逻辑和offer()方法一样。
    * take() 取出并且remove掉queue里的element(认为是在queue里的。。。),取不到东西他会一直等。
    * poll() 取出并且remove掉queue里的element(认为是在queue里的。。。),只有到碰巧另外一个线程正在往queue里offer数据或者put数据的时候,该方法才会取到东西。否则立即返回null。
    * poll(2000, TimeUnit.SECONDS) 等待指定的时间然后取出并且remove掉queue里的element,其实就是再等其他的thread来往里塞。
    * isEmpty()永远是true。
    * remainingCapacity() 永远是0。
    * remove()和removeAll() 永远是false。

转载于:https://my.oschina.net/jielucky/blog/158530

SynchronousQueueE简介相关推荐

  1. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  2. Docker学习(一)-----Docker简介与安装

    一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...

  3. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  4. TensorRT简介

    TensorRT 介绍 引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference) ...

  5. 谷粒商城学习笔记——第一期:项目简介

    一.项目简介 1. 项目背景 市面上有5种常见的电商模式 B2B.B2C.C2B.C2C.O2O B2B 模式(Business to Business),是指商家和商家建立的商业关系.如阿里巴巴 B ...

  6. 通俗易懂的Go协程的引入及GMP模型简介

    本文根据Golang深入理解GPM模型加之自己的理解整理而来 Go协程的引入及GMP模型 一.协程的由来 1. 单进程操作系统 2. 多线程/多进程操作系统 3. 引入协程 二.golang对协程的处 ...

  7. Linux 交叉编译简介

    Linux 交叉编译简介 主机,目标,交叉编译器 主机与目标 编译器是将源代码转换为可执行代码的程序.像所有程序一样,编译器运行在特定类型的计算机上,输出的新程序也运行在特定类型的计算机上. 运行编译 ...

  8. TVM Operator Inventory (TOPI)简介

    TOPI简介 这是 TVM Operator Inventory (TOPI) 的介绍.TOPI 提供了比 TVM 具有更高抽象的 numpy 风格的,通用操作和调度.TOPI 如何在 TVM 中,编 ...

  9. 计算机视觉系列最新论文(附简介)

    计算机视觉系列最新论文(附简介) 目标检测 1. 综述:深度域适应目标检测标题:Deep Domain Adaptive Object Detection: a Survey作者:Wanyi Li, ...

最新文章

  1. Python Qt GUI设计:QPushButton、QRadioButton和QCheckBox按钮类(基础篇—12)
  2. mysql 安装卸载_MySQL(一)——安装、卸载以及基本操作
  3. PyTorch Lightning 全攻略!
  4. RTX51 Tiny中容易混淆的问题
  5. opencv 叠加两张图_「干货」教你如何用OpenCV快速寻找图像差异处
  6. 快速排序伪代码_归并排序之入门到quot;放弃quot;
  7. 如何查看电脑CPU实时功耗
  8. Redmi王腾:Redmi 10X还会带来全新滤镜
  9. 圣诞限定快乐,送3本技术好书
  10. jsf tree组件_JSF表单组件示例教程
  11. 翻译 | 上手 Webpack ? 这篇就够了!
  12. 《基于Nginx的中间件架构》学习笔记---3.nginx的目录分析
  13. 有限元分析试题:ANSYS有限元分析中级培训考题及其答案解析(填空+选择+判断+解答)
  14. matlab 仿真短路故障设置,基于MatlabSimulink的电力系统故障仿真与
  15. python毕业设计论文-基于Python的网络爬虫的设计与实现.doc
  16. Matlab绘图保存为.fig格式以使用,及.fig文件的加载与数据读取
  17. Ubuntu16.04下firefox flash过期问题
  18. 仿佛来自虚空,Grothendieck的故事2
  19. 教你一个快速查找批量文件的好方法
  20. MDN的HTML入门,关于MDN,HTML入门来自MDN文档

热门文章

  1. [转] FFmpeg常用基本命令
  2. 管理刀片服务器的KVM切换器
  3. php使用phantomjs
  4. 创新性应用深度学习,IBM在语音识别领域取得了里程碑式突破
  5. This application requires Java Runtime Environment
  6. [C#参考]字符编码
  7. spring随笔(二) AOP
  8. Java多线程编程系列-多线程基础
  9. 国嵌视频光盘及源码网盘下载地址-续
  10. 知乎高赞 | Go 技术一面一般考哪些内容