SynchronousQueueE简介
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简介相关推荐
- etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理
1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...
- Docker学习(一)-----Docker简介与安装
一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...
- 【Spring】框架简介
[Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...
- TensorRT简介
TensorRT 介绍 引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference) ...
- 谷粒商城学习笔记——第一期:项目简介
一.项目简介 1. 项目背景 市面上有5种常见的电商模式 B2B.B2C.C2B.C2C.O2O B2B 模式(Business to Business),是指商家和商家建立的商业关系.如阿里巴巴 B ...
- 通俗易懂的Go协程的引入及GMP模型简介
本文根据Golang深入理解GPM模型加之自己的理解整理而来 Go协程的引入及GMP模型 一.协程的由来 1. 单进程操作系统 2. 多线程/多进程操作系统 3. 引入协程 二.golang对协程的处 ...
- Linux 交叉编译简介
Linux 交叉编译简介 主机,目标,交叉编译器 主机与目标 编译器是将源代码转换为可执行代码的程序.像所有程序一样,编译器运行在特定类型的计算机上,输出的新程序也运行在特定类型的计算机上. 运行编译 ...
- TVM Operator Inventory (TOPI)简介
TOPI简介 这是 TVM Operator Inventory (TOPI) 的介绍.TOPI 提供了比 TVM 具有更高抽象的 numpy 风格的,通用操作和调度.TOPI 如何在 TVM 中,编 ...
- 计算机视觉系列最新论文(附简介)
计算机视觉系列最新论文(附简介) 目标检测 1. 综述:深度域适应目标检测标题:Deep Domain Adaptive Object Detection: a Survey作者:Wanyi Li, ...
最新文章
- Python Qt GUI设计:QPushButton、QRadioButton和QCheckBox按钮类(基础篇—12)
- mysql 安装卸载_MySQL(一)——安装、卸载以及基本操作
- PyTorch Lightning 全攻略!
- RTX51 Tiny中容易混淆的问题
- opencv 叠加两张图_「干货」教你如何用OpenCV快速寻找图像差异处
- 快速排序伪代码_归并排序之入门到quot;放弃quot;
- 如何查看电脑CPU实时功耗
- Redmi王腾:Redmi 10X还会带来全新滤镜
- 圣诞限定快乐,送3本技术好书
- jsf tree组件_JSF表单组件示例教程
- 翻译 | 上手 Webpack ? 这篇就够了!
- 《基于Nginx的中间件架构》学习笔记---3.nginx的目录分析
- 有限元分析试题:ANSYS有限元分析中级培训考题及其答案解析(填空+选择+判断+解答)
- matlab 仿真短路故障设置,基于MatlabSimulink的电力系统故障仿真与
- python毕业设计论文-基于Python的网络爬虫的设计与实现.doc
- Matlab绘图保存为.fig格式以使用,及.fig文件的加载与数据读取
- Ubuntu16.04下firefox flash过期问题
- 仿佛来自虚空,Grothendieck的故事2
- 教你一个快速查找批量文件的好方法
- MDN的HTML入门,关于MDN,HTML入门来自MDN文档