阻塞队列BlockingQueue
BlockingQueue最终会有四种状况,抛出异常、返回特殊值、阻塞、超时,下表总结了这些方法:
抛出异常 |
特殊值 |
阻塞 |
超时 |
|
插入 |
add(e) |
offer(e) |
put(e) |
offer(e, time, unit) |
移除 |
remove() |
poll() |
take() |
poll(time, unit) |
检查 |
element() |
peek() |
不可用 |
不可用 |
BlockingQueue是个接口,有如下实现类:
1. ArrayBlockQueue:一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象必须明确大小,像数组一样。
2. LinkedBlockQueue:一个可改变大小的阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象如果没有明确大小,默认值是Integer.MAX_VALUE。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。
3. PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。
4. SynchronousQueue:同步队列。同步队列没有任何容量,每个插入必须等待另一个线程移除,反之亦然。
下面使用ArrayBlockQueue来实现之前实现过的生产者消/费者模式,代码如下:
- /** 定义一个盘子类,可以放鸡蛋和取鸡蛋 */
- public class BigPlate {
- /** 装鸡蛋的盘子,大小为5 */
- private BlockingQueue<Object> eggs = new ArrayBlockingQueue<Object>(5);
- /** 放鸡蛋 */
- public void putEgg(Object egg) {
- try {
- eggs.put(egg);// 向盘子末尾放一个鸡蛋,如果盘子满了,当前线程阻塞
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // 下面输出有时不准确,因为与put操作不是一个原子操作
- System.out.println("放入鸡蛋");
- }
- /** 取鸡蛋 */
- public Object getEgg() {
- Object egg = null;
- try {
- egg = eggs.take();// 从盘子开始取一个鸡蛋,如果盘子空了,当前线程阻塞
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // 下面输出有时不准确,因为与take操作不是一个原子操作
- System.out.println("拿到鸡蛋");
- return egg;
- }
- /** 放鸡蛋线程 */
- static class AddThread extends Thread {
- private BigPlate plate;
- private Object egg = new Object();
- public AddThread(BigPlate plate) {
- this.plate = plate;
- }
- public void run() {
- plate.putEgg(egg);
- }
- }
- /** 取鸡蛋线程 */
- static class GetThread extends Thread {
- private BigPlate plate;
- public GetThread(BigPlate plate) {
- this.plate = plate;
- }
- public void run() {
- plate.getEgg();
- }
- }
- public static void main(String[] args) {
- BigPlate plate = new BigPlate();
- // 先启动10个放鸡蛋线程
- for(int i = 0; i < 10; i++) {
- new Thread(new AddThread(plate)).start();
- }
- // 再启动10个取鸡蛋线程
- for(int i = 0; i < 10; i++) {
- new Thread(new GetThread(plate)).start();
- }
- }
- }
转载于:https://www.cnblogs.com/m2492565210/p/7468392.html
阻塞队列BlockingQueue相关推荐
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...
简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用 Condition:可以理解成一把锁的一个钥匙,它既可以解锁(通知放行),又可以加锁(阻塞) n ...
- 并发编程-concurrent指南-阻塞队列BlockingQueue
阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列. 适用场景: BlockingQueue通常用于一个线程 ...
- 抽象同步器AQS应用之--阻塞队列BlockingQueue,如何保证任务一定被消费?
文章目录 1.阻塞队列简介 2. BlockingQueue源码分析 3. 生产者消费者模型如何保证信息不会丢失? 1.阻塞队列简介 1.1 什么是阻塞队列? 阻塞队列是一个队列 ①:当队列是空的,从 ...
- java 阻塞队列 BQ_阻塞队列 BlockingQueue的使用(二)
原 阻塞队列 BlockingQueue的使用(二) BlockingQueue 的核心方法:方法类型抛出异常特殊值阻塞超时 插入add(e)offer(e)put(e)offer(e,time,un ...
- 阻塞队列BlockingQueue源码
JAVA阻塞队列 在学习线程池框架ThreadPoolExecutor时发现线程池的实现依赖到了阻塞队列BlockingQueue,在队列为空时take方法会阻塞当前线程,因此这里以ThreadPoo ...
- java多线程-阻塞队列BlockingQueue
大纲 BlockingQueue接口 ArrayBlockingQueue 一.BlockingQueue接口 public interface BlockingQueue<E> exte ...
- 并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池
文章目录 概述 阻塞队列的常用场景 阻塞队列的4种处理方式 JDK 7提供的7个阻塞队列 ArrayBlockingQueue LinkedBlockingQueue PriorityBlocking ...
- 阻塞队列BlockingQueue用法
多线程环境中,通过队列可以很容易实现数据共享,比如经典的"生产者"和"消费者"模型中,通过队列可以很便利地实现两者之间的数据共享. 假设我们有若干生产者线程,另 ...
最新文章
- ubuntu分屏软件_Ubuntu 17.10安装终端分屏:Terminator终端终结者
- eclipse(或者myeclipse)常用配置方法
- long 对应oracle,【转】oracle number与java中long、int的对应
- Csharp迭代循环
- OpenGL渲染管线,着色器,光栅化等概念理解
- libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解
- Sharding-JDBC(操作公共表)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记013
- Final Cut Pro 10.6 for Mac(fcpx视频剪辑)
- jmeter元件的作用域与执行顺序
- 2018-2019 C++期末复习资料
- Windows Phone 地图定位 及导出GPX文件
- [雷霄骅]修改了一个YUV/RGB播放器
- Linux基础入门教程-超详细
- oracle创建PDB数据库
- java写的小米商城_开发”小米商城官网首页”(静态页面)
- 基于JWT的API权限鉴定
- 说话干嘛要“之道”啦?(持续更新中)
- 特殊的自然常数π以及e
- 传智播客传智汇与华为联合举办主题沙龙,解读网络安全解决方案
- vasp计算压电系数_求助DFTP算出来的压电系数
热门文章
- 【C/C++10】天气APP:MySQL/PostgreSQL,环境变量/动静态库,Linux/Oracle字符集
- 【Linux】一步一步学Linux——nl命令(43)
- python实时数据流设计_Python读取实时数据流示例
- c++ 链表_算法学习笔记 - 链表 - 单链表的粗糙实现
- linux系统下的程序开发报告册,linux系统及应用应用开发实验报告册
- android win7 共享网络打印机,win7系统设置共享网络打印机的操作方法
- 迅雷启动不了,提示Atl71.dll文件丢失
- Linux Kernel 0.01 的编译和运行
- PX4 - position_estimator_inav
- 我的世界1.13的服务器网站,我的世界1.13纯净版