BlockingQueue实例
BlockingQueue 支持两个附加操作的 Queue,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用。 BlockingQueue 不接受 null 元素。试图 add、put 或 offer 一个 null 元素时,某些实现会抛出 NullPointerException。null 被用作指示 poll 操作失败的警戒值。 BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个 remainingCapacity,超出此容量,便无法无阻塞地 put 额外的元素。 没有任何内部容量约束的 BlockingQueue 总是报告 Integer.MAX_VALUE 的剩余容量。 BlockingQueue 实现主要用于生产者-使用者队列,但它另外还支持 Collection 接口。因此,举例来说,使用 remove(x) 从队列中移除任意一个元素是有可能的。 然而,这种操作通常不 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。 BlockingQueue 实现是线程安全的。所有排队方法都可以使用内部锁定或其他形式的并发控制来自动达到它们的目的。 然而,大量的 Collection 操作(addAll、containsAll、retainAll 和 removeAll)没有 必要自动执行,除非在实现中特别说明。 因此,举例来说,在只添加了 c 中的一些元素后,addAll(c) 有可能失败(抛出一个异常)。 BlockingQueue 实质上不 支持使用任何一种“close”或“shutdown”操作来指示不再添加任何项。 这种功能的需求和使用有依赖于实现的倾向。例如,一种常用的策略是:对于生产者,插入特殊的 end-of-stream 或 poison 对象,并根据使用者获取这些对象的时间来对它们进行解释。 下面的例子演示了这个阻塞队列的基本功能。
package com.unicss;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;public class MyBlockingQueue extends Thread {public static BlockingQueue<String> queue = new LinkedBlockingQueue<String>(5);private int index;public MyBlockingQueue(int i) {this.index = i;}public void run() {try {queue.put(String.valueOf(this.index));System.out.println("{" + this.index + "} in queue!");} catch (Exception e) {e.printStackTrace();}}public static void main(String args[]) {ExecutorService service = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {service.submit(new MyBlockingQueue(i));}Thread thread = new Thread() {public void run() {try {while (true) {Thread.sleep((int) (Math.random() * 1000));System.out.println("=======" + MyBlockingQueue.queue.size());if (MyBlockingQueue.queue.isEmpty())break;String str = MyBlockingQueue.queue.take();System.out.println(str + " has take!");}} catch (Exception e) {e.printStackTrace();}}};service.submit(thread);service.shutdown();}
}
BlockingQueue实例相关推荐
- 生产者-消费者中的缓冲区:BlockingQueue接口
BlockingQueue接口使用场景 相信大家对生产者-消费者模式不陌生,这个经典的多线程协作模式,最简单的描述就是生产者线程往内存缓冲区中提交任务,消费者线程从内存缓冲区里获取任务执行.在生产者- ...
- Pratice Of Concurrency(一: BlockingQueue )
Java java.util.currency包中的BlockingQueue接口意味着线程可以在一个队列中添加和提取对象.在接下来的段落中,我们将学习如何使用BlockingQueue接口. Blo ...
- 从串行线程封闭到对象池、线程池
今天讲一个牛逼而实用的概念,串行线程封闭.对象池是串行线程封闭的典型应用场景:线程池糅合了对象池技术,但核心实现不依赖于对象池,很容易产生误会. 本文从串行线程封闭和对象池入手,最后通过源码分析线程池 ...
- 并发设计模式之生产者-消费者模式
点击查看原文: http://www.joyhwong.com/2016/11/19/并发设计模式之生产者-消费者模式/ 生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解 ...
- 线程池详解:线程池的七大参数及运行流程
尽管 Executors 的工厂方法使用方便,在生产场景被很多企业的开发规范所禁用.要求通过标准构造器 ThreadPoolExecutor 去构造工作线程池. 1. 核心数据结构 public cl ...
- 高并发线程/锁/内存处理模型
文章目录 锁与线程 一.进程/线程的基本介绍 进程 线程 1 线程的调度与时间片 2 优先级 3 生命周期 进程与线程的区别 二.线程的使用 2.1 Thread类的介绍 2.2 创建线程的方法 Th ...
- Java面试题,Java,面试题,线程池
Java面试题:线程池 首先要注意的概念 JUC-线程池架构图 1.Executor 2.ExecutorService 3.AbstractExecutorService 4.ThreadPoolE ...
- 前端开发基础知识汇总
一.HTML 1.前言与常用标签 浏览器 内核 备注 IE Trident IE.猎豹安全.360极速浏览器.百度浏览器 firefox Gecko 可惜这几年已经没落了,打开速度慢.升级频繁.猪一样 ...
- Spring Cloud微服务系统架构的一些简单介绍和使用
Spring Cloud 目录 特征 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序上下文层次结构 改变Bootstrap的位置Properties ...
最新文章
- VTL-vm模板的变量用法
- 我自己可以挖矿了!使用Ethereum C++客户端Aleth建一个私有网络,并使用Remix部署一个智能合约
- 【FPGA】双端口RAM的设计(同步读写)
- TS流解析之PAT表格解析
- CVPR 2019笔迹识别论文:逆鉴别网络+八路Attention
- [Spring5]IOC容器_Bean管理注解方式_完全注解开发
- NXP UWB NCJ29D5开发(一)环境搭建
- 解决Windows Server2008 R2中IE开网页时弹出阻止框
- javascript全栈开发实践-web-7
- SQL 时间截按月分组查询
- 深度学习自学(二):人脸检测MTCNN学习总结
- js基础知识汇总01
- 2022尚硅谷docker学习笔记
- 第 1 课:KNX 与 Arduino:硬件连接
- 感谢折磨你的人[一]
- CTO,技术总监和技术经理有啥区别?
- CMake问题:The CXX compiler identification is unknown
- IT新手入职的一些注意事项
- Dubbo的@Reference和@Service说明
- 系统集成项目管理工程师高频考点(第三章)
热门文章
- 全国社会媒体处理大会即将召开,一文详解四天议程精华
- DAB-Deformable-DETR源码学习记录之模型构建(二)
- mac 爱普生打印机驱动_爱普生l201打印机驱动下载Mac版-爱普生L201驱动Mac版下载 V8.7.5-PC6苹果网...
- python自学成才之路 miniconda创建虚拟环境
- js创建节点及节点操作
- 爬取百度 《一人之下》 贴吧
- Windows10字符映射表的搜索功能
- Android 通用图标生成器
- JZOJ.4377[GDOI2016模拟3.10]习用之语 解题报告
- 试题 基础练习 数的读法