最近学习了 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 中的一些坑相关推荐

  1. elastic search java_在 Java 应用程序中使用 Elasticsearch

    如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣.尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsear ...

  2. 围棋包围java_在java围棋游戏中怎么消去被围得棋子

    麻烦大家一下帮我弄个消除被围棋子的算法我的围棋算法如下{intx=-1,y=-1,color=1;Buttonb=newButton("重新开局");TextFieldt1=new ...

  3. 记录一下uni-app开发中遇到的坑

    一.uni-app中不能操作dom uni-app开发中不能操作dom,就是一切的按照vue那种方式进行数据绑定,要不然在网页端看着是好好的,但是一旦打包放到真机上就是各种问题.所以只要熟悉vue并且 ...

  4. 记录pyinstaller打包过程中遇到的坑

    打包的过程主要参考PyInstaller打包详解 多线程bug build过程不报错,运行exe之后弹出空的命令行窗口,调出任务管理器发现main.exe在不停的启动进程. 查阅pyinstaller ...

  5. 三元表达式java_记录一个Java三元表达式中的陷阱

    今天遇到一个奇怪的Java三元表达式中的空指针异常.特此记录. 代码 代码示意如下: Integer itemVO = null; Integer globleLatenessToleranceUse ...

  6. Java之BlockingQueue

    Java之BlockingQueue 再看BlockingQueue之前,首先得了解什么是Queue,以解了解Queue的逻辑结构还有特性,了解ReentrantLock可重入锁是什么. Blocki ...

  7. BlockingQueue Interface In Java学习

    一.从"生产者"和"消费者"模型谈起 生产者消费者问题,也称有限缓冲问题(Bounded-buffer problem),是一个多进程同步问题的经典案例.通过队 ...

  8. 形式参数内存在哪java_深入浅出Java中JVM内存管理

    原标题:深入浅出Java中JVM内存管理 Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗?可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC ...

  9. 使用Java的BlockingQueue实现生产者-消费者

    BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类 1.ArrayBl ...

最新文章

  1. OpenGL概念辨析: 窗口,视口,裁剪区域
  2. 在SpringBoot中使用Spring Session解决分布式会话共享问题
  3. 几种支持REST的Java框架
  4. MySQL主键的理解
  5. spring-junit4_基于Spring的应用程序-迁移到Junit 5
  6. asp.net mvc使用的心得和问题的解决方法(陆续更新ing)
  7. mysql的jar包文件在哪找_java连接mysql要导入的jar包在哪。
  8. 本体学习的概念及目标
  9. 数据库语句数据库学习(3)——数据库的创建与删除
  10. 基于RFID的物联网系统
  11. 3300字详解闲鱼上如何找到爆款品类?
  12. VS2019安装QT5.14.1全过程
  13. 【数学模型】基于Matlab模拟超市排队系统
  14. Topcoder EllysBottles 题解
  15. 抖音小姐姐太好看了,我用Python把视频全部爬取下来
  16. CSS / 三大特性+盒子模型+PS基础
  17. 西门子S7-200 Smart PLC下载
  18. matlab hough算法车牌识别,一种利用Hough变换和先验知识的车牌识别新方法
  19. 麦当劳叔叔用 AI 面试服务员,合格就录用
  20. Android _《看完不忘系列》之Retrofit,android面试题及答案2019

热门文章

  1. 深度学习核心技术精讲100篇(七十四)-教你如何最快入门用户画像
  2. MC, MCMC, Gibbs采样 原理实现(in R)
  3. ModelCheckpoint 讲解【TensorFlow2入门手册】
  4. LeetCode题组:第13题-罗马数字转整数
  5. Python的__str__()方法
  6. Graph Embedding方案之DeepWalk
  7. solr调用lucene底层实现倒排索引源码解析
  8. QQ会员亿级Web系统的容错性建设实践--转
  9. Java – Reading a Large File Efficiently--转
  10. SOAP 及其安全控制--转载