blockingqueue java_记录 Java 的 BlockingQueue 中的一些坑
最近学习了 BlockingQueue,发现 java 的 BlockingQueue 并不是每一个实现都按照 BlockingQueue 的语意来的,其中有不少坑。
直接上代码吧:
1、关于PriorityBlockingQueue,以下代码运行结果是什么(答案往下拉)?
BlockingQueue queue = new PriorityBlockingQueue<>(2);
queue.put(9);
queue.put(1);
queue.put(8);
System.out.println("queue.size() = " +queue.size());
System.out.println("queue.take() = " +queue.take());
System.out.println("queue = " + queue);
2、关于 SynchronousQueue,以下代码运行结果是什么(答案往下拉)?
BlockingQueue queue = new SynchronousQueue<>();
System.out.println("queue.offer(1) = " + queue.offer(1));
System.out.println("queue.offer(2) = " + queue.offer(2));
System.out.println("queue.offer(3) = " + queue.offer(3));
System.out.println("queue.size = " +queue.size());
System.out.println("queue.take() = " + queue.take());
3、总体测试,以下代码运行结果是什么(答案往下拉)?
offer(new ArrayBlockingQueue<>(2));
offer(new LinkedBlockingQueue<>(2));
offer(new PriorityBlockingQueue<>(2));
offer(new SynchronousQueue<>());
private static void offer(BlockingQueue queue) throwsException {
System.out.println("queue.getClass() = " +queue.getClass().getName());
System.out.println("queue.offer(1) = " + queue.offer(1));
System.out.println("queue.offer(2) = " + queue.offer(2));
System.out.println("queue.offer(3) = " + queue.offer(3));
System.out.println("queue.size() = " +queue.size());
System.out.println("queue.take() = " +queue.take());
}
下面公布答案:
1、关于PriorityBlockingQueue 运行结果:
原因:
(1).PriorityBlockingQueue put(Object) 方法不阻塞,内部直接调用 offer(Object) 方法
(2).PriorityBlockingQueue offer(Object) 方法不限制,初始化Queue大小是没用的
(3).PriorityBlockingQueue 插入对象会做排序,默认参照元素 Comparable 实现,或者显示地传递 Comparator(因为传入对象是Integer,是默认实现了Comparable的)
2、关于 SynchronousQueue 运行结果
原因:
(1).SynchronousQueue 是无空间,offer 永远返回 false(2).SynchronousQueue take() 方法会被阻塞,必须被其他线程显示地调用 put(Object)
如果第1题、第2题你的回答都有问题,那么总结一下,再看第3题的答案吧
3、总体测试,运行结果
总体而言,BlockingQueue 最让人想不到的就是 PriorityBlockingQueue 和 SynchronousQueue 了。
总结一下:
(1)ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,FIFO(先进先出)。
(2)LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue,静态工厂方法 Executors.newFixedThreadPool() 使用了这个队列。
(3)SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法 Executors.newCachedThreadPool() 使用了这个队列。
(4)PriorityBlockingQueue:一个具有优先级的无限阻塞队列。
本文有参考小马哥的讲课。
blockingqueue java_记录 Java 的 BlockingQueue 中的一些坑相关推荐
- elastic search java_在 Java 应用程序中使用 Elasticsearch
如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣.尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsear ...
- 围棋包围java_在java围棋游戏中怎么消去被围得棋子
麻烦大家一下帮我弄个消除被围棋子的算法我的围棋算法如下{intx=-1,y=-1,color=1;Buttonb=newButton("重新开局");TextFieldt1=new ...
- 记录一下uni-app开发中遇到的坑
一.uni-app中不能操作dom uni-app开发中不能操作dom,就是一切的按照vue那种方式进行数据绑定,要不然在网页端看着是好好的,但是一旦打包放到真机上就是各种问题.所以只要熟悉vue并且 ...
- 记录pyinstaller打包过程中遇到的坑
打包的过程主要参考PyInstaller打包详解 多线程bug build过程不报错,运行exe之后弹出空的命令行窗口,调出任务管理器发现main.exe在不停的启动进程. 查阅pyinstaller ...
- 三元表达式java_记录一个Java三元表达式中的陷阱
今天遇到一个奇怪的Java三元表达式中的空指针异常.特此记录. 代码 代码示意如下: Integer itemVO = null; Integer globleLatenessToleranceUse ...
- Java之BlockingQueue
Java之BlockingQueue 再看BlockingQueue之前,首先得了解什么是Queue,以解了解Queue的逻辑结构还有特性,了解ReentrantLock可重入锁是什么. Blocki ...
- BlockingQueue Interface In Java学习
一.从"生产者"和"消费者"模型谈起 生产者消费者问题,也称有限缓冲问题(Bounded-buffer problem),是一个多进程同步问题的经典案例.通过队 ...
- 形式参数内存在哪java_深入浅出Java中JVM内存管理
原标题:深入浅出Java中JVM内存管理 Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗?可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC ...
- 使用Java的BlockingQueue实现生产者-消费者
BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类 1.ArrayBl ...
最新文章
- OpenGL概念辨析: 窗口,视口,裁剪区域
- 在SpringBoot中使用Spring Session解决分布式会话共享问题
- 几种支持REST的Java框架
- MySQL主键的理解
- spring-junit4_基于Spring的应用程序-迁移到Junit 5
- asp.net mvc使用的心得和问题的解决方法(陆续更新ing)
- mysql的jar包文件在哪找_java连接mysql要导入的jar包在哪。
- 本体学习的概念及目标
- 数据库语句数据库学习(3)——数据库的创建与删除
- 基于RFID的物联网系统
- 3300字详解闲鱼上如何找到爆款品类?
- VS2019安装QT5.14.1全过程
- 【数学模型】基于Matlab模拟超市排队系统
- Topcoder EllysBottles 题解
- 抖音小姐姐太好看了,我用Python把视频全部爬取下来
- CSS / 三大特性+盒子模型+PS基础
- 西门子S7-200 Smart PLC下载
- matlab hough算法车牌识别,一种利用Hough变换和先验知识的车牌识别新方法
- 麦当劳叔叔用 AI 面试服务员,合格就录用
- Android _《看完不忘系列》之Retrofit,android面试题及答案2019
热门文章
- 深度学习核心技术精讲100篇(七十四)-教你如何最快入门用户画像
- MC, MCMC, Gibbs采样 原理实现(in R)
- ModelCheckpoint 讲解【TensorFlow2入门手册】
- LeetCode题组:第13题-罗马数字转整数
- Python的__str__()方法
- Graph Embedding方案之DeepWalk
- solr调用lucene底层实现倒排索引源码解析
- QQ会员亿级Web系统的容错性建设实践--转
- Java – Reading a Large File Efficiently--转
- SOAP 及其安全控制--转载