阻塞队列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();
- }
- }
- }
阻塞队列BlockingQueue的更多相关文章
- Java并发编程-阻塞队列(BlockingQueue)的实现原理
背景:总结JUC下面的阻塞队列的实现,很方便写生产者消费者模式. 常用操作方法 常用的实现类 ArrayBlockingQueue DelayQueue LinkedBlockingQueue Pri ...
- Java并发(十八):阻塞队列BlockingQueue
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列. 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用. 阻塞队列常用于生产 ...
- spring线程池ThreadPoolTaskExecutor与阻塞队列BlockingQueue
一: ThreadPoolTaskExecutor是一个spring的线程池技术,查看代码可以看到这样一个字段: private ThreadPoolExecutor threadPoolExecut ...
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- 并发编程-concurrent指南-阻塞队列BlockingQueue
阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列. 适用场景: BlockingQueue通常用于一个线程 ...
- Java并发指南11:解读 Java 阻塞队列 BlockingQueue
解读 Java 并发队列 BlockingQueue 转自:https://javadoop.com/post/java-concurrent-queue 最近得空,想写篇文章好好说说 java 线程 ...
- 阻塞队列BlockingQueue用法
多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享. 假设我们有若干生产者线程,另外又有若干个消费者线程.如果生产者线程需 ...
- 阻塞队列BlockingQueue用法(转)
多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享. 假设我们有若干生产者线程,另外又有若干个消费者线程.如果生产者线程需 ...
- java并发包——阻塞队列BlockingQueue及源码分析
一.摘要 BlockingQueue通常用于一个线程在生产对象,而另外一个线程在消费这些对象的场景,例如在线程池中,当运行的线程数目大于核心的线程数目时候,经常就会把新来的线程对象放到Blocking ...
随机推荐
- 201521123073 《Java程序设计》第13周学习总结
1. 13周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jm ...
- 201521123011《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. MySql数据库简单操作 1.启动与退出(quit或exit ) 操作 显示所有数据库: show databa ...
- 201521123115 《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- Could not chdir to home directory /home/USER: Permission denied
Could not chdir to home directory /home/USER: Permission denied 2 years ago davidzhang We changed t ...
- 从文本中读取内容并把读取到的内容转化成二进制保存的形式(包含十进制数如何转换成二进制数dtob函数)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<malloc.h> d ...
- webservice06#异常#Handler
1, 异常处理 package com.yangw.soap.service; public class UserException extends Exception { public UserEx ...
- Spring-Boot:6分钟掌握SpringBoot开发
构建项目 从技术角度来看,我们要用Spring MVC来处理Web请求,用Thymeleaf来定义Web视图,用Spring Data JPA来把阅读列表持久化到数据库里,姑且先用嵌入式的H2数据库. ...
- CSS3 animation-timing-function steps()
animation-timging-function 主要是控制css动画从开始到结束的速度. linear:线性过渡.等同于贝塞尔曲线(0.0, 0.0, 1.0, 1.0) ease:平滑过渡.等 ...
- ArrayListd的长度问题
namespace ArrayListd的长度问题{ class Program { static void Main(string[] args) { //需要的参数是object类型 //alt+ ...
- Delphi10.2 VCL Forms Application 的构成
Delphi10.2 项目的构成(File Extensions of Files Generated by RAD Studio) Step1.打开 Delphi10.2,选择[File | New ...