BlockingQueue使用详解以及测试代码
BlockingQueue
另一个Queue,它支持在检索元素时等待队列变为非空,以及在存储元素时等待队列中的空间变为可用的操作。
BlockingQueue方法有四种形式,有不同的处理操作的方式,这些操作不能立即被满足,但可能在将来的某个时候被满足:
第一个 抛出一个异常,
第二个 返回一个特殊值(根据操作的不同,可以是null或false)
第三个 无限期地阻塞当前线程,直到操作成功
第四个 在放弃之前只阻塞给定的最大时间限制。这些方法总结如下表:
BlockingQueueTest
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;class BlockingQueueTest {public static void main(String[] args) throws InterruptedException {//队列的大小ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);System.out.println(arrayBlockingQueue.add("a"));System.out.println(arrayBlockingQueue.add("b"));System.out.println(arrayBlockingQueue.add("c"));try {//java.lang.IllegalStateException: Queue fullSystem.out.println(arrayBlockingQueue.add("d"));} catch (Exception e) {e.printStackTrace();}System.out.println("----------------------");System.out.println(arrayBlockingQueue.remove());System.out.println(arrayBlockingQueue.remove());System.out.println(arrayBlockingQueue.remove());try {//java.util.NoSuchElementExceptionSystem.out.println(arrayBlockingQueue.remove());} catch (Exception e) {//抛出异常e.printStackTrace();}TimeUnit.SECONDS.sleep(1);System.out.println("==============第一阶段测试完毕==============");arrayBlockingQueue = new ArrayBlockingQueue(3);System.out.println(arrayBlockingQueue.offer("a"));System.out.println(arrayBlockingQueue.offer("b"));System.out.println(arrayBlockingQueue.offer("c"));//offer 不抛出异常System.out.println(arrayBlockingQueue.offer("d"));System.out.println(arrayBlockingQueue.poll());System.out.println(arrayBlockingQueue.poll());System.out.println(arrayBlockingQueue.poll());//null 不抛出异常System.out.println(arrayBlockingQueue.poll());TimeUnit.SECONDS.sleep(1);System.out.println("==============第二阶段测试完毕==============");arrayBlockingQueue = new ArrayBlockingQueue(3);arrayBlockingQueue.put("a");arrayBlockingQueue.put("b");arrayBlockingQueue.put("c");//队列没有位置就会阻塞arrayBlockingQueue.put("c");System.out.println(arrayBlockingQueue.take());System.out.println(arrayBlockingQueue.take());System.out.println(arrayBlockingQueue.take());}
}
运行结果
true
truetrue
a
b
c
java.lang.IllegalStateException: Queue full
at java.util.AbstractQueue.add(AbstractQueue.java:98)
at java.util.concurrent.ArrayBlockingQueue.add(ArrayBlockingQueue.java:312)
at online.wenmeng.cloudfile.CyclicBarrierTests.main(CloudFileApplicationTests.java:17)
java.util.NoSuchElementException
at java.util.AbstractQueue.remove(AbstractQueue.java:117)
at online.wenmeng.cloudfile.CyclicBarrierTests.main(CloudFileApplicationTests.java:27)
第一阶段测试完毕
true
true
true
false
a
b
c
null
第二阶段测试完毕[第三阶段阻塞,导致没有输出,也不会运行完成]
SynchronousQueueTest
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;class SynchronousQueueTest {public static void main(String[] args) throws InterruptedException {SynchronousQueue<String> synchronousQueue = new SynchronousQueue<>(); //同步队列//写线程new Thread(() -> {try {System.out.println(Thread.currentThread().getName() + "put 1");synchronousQueue.put("1");System.out.println(Thread.currentThread().getName() + "put 2");synchronousQueue.put("2");System.out.println(Thread.currentThread().getName() + "put 3");synchronousQueue.put("3");} catch (InterruptedException e) {e.printStackTrace();}}, "T1").start();//读线程new Thread(() -> {try {TimeUnit.SECONDS.sleep(3);System.out.println(Thread.currentThread().getName() + "=>" + synchronousQueue.take());TimeUnit.SECONDS.sleep(3);System.out.println(Thread.currentThread().getName() + "=>" + synchronousQueue.take());TimeUnit.SECONDS.sleep(3);System.out.println(Thread.currentThread().getName() + "=>" + synchronousQueue.take());} catch (InterruptedException e) {e.printStackTrace();} finally {}}, "T2").start();}
}
运行结果
T1put 1
T2=>1
T1put 2
T2=>2
T1put 3
T2=>3
BlockingQueue使用详解以及测试代码相关推荐
- Java 线程池详解及实例代码
转载自 Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...
- 【OpenCV实战】OpenCV实现人脸检测详解(含代码)
OpenCV中有许多可以进行人脸.人眼检测的特征文件,今天我们利用OpenCV中自带的特征文件haarcascade_frontalface_default.xml来进行人脸检测. [OpenCV实战 ...
- 【数据分析与挖掘实战】金融风控之贷款违约预测详解2(有代码和数据集)
本文接着上一篇博客,如果您未阅读上篇博客,请点击[数据分析与挖掘实战]金融风控之贷款违约预测详解1(有代码和数据集) 七.建模和调参 7.1模型相关原理介绍 由于相关算法原理篇幅较长,本文推荐了一些博 ...
- 2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型(三)
目录 前言 一.六种物料挑选 二.周数处理 三.时序预测模型 模型预测结果 建模的部分后续将会写出,想要了解更多的欢迎加博主微信,免费获取更多细化思路+模型! 点关注,防走丢,如有纰漏之处,请留言指教 ...
- 计算机组织与结构poc,CPU漏洞原理详解以及POC代码分享
原标题:CPU漏洞原理详解以及POC代码分享 首先,这个漏洞已经公布近一周时间了,看到各大媒体.公众号到处在宣传,本打算不再发布类似信息,但是发现很多媒体的报道达到了一个目的--几乎所有的CPU都有漏 ...
- ADMM,ISTA,FISTA算法步骤详解,MATLAB代码,求解LASSO优化问题
ADMM,ISTA,FISTA算法步骤详解,MATLAB代码,求解LASSO优化问题 原创文章!转载需注明来源:©️ Sylvan Ding's Blog ❤️ 实验目的 了解 ADMM, ISTA, ...
- python随机数程序源码_Python 实现随机数详解及实例代码
Python3实现随机数 random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Pyth ...
- java super实例_java Super 用法详解及实例代码
java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...
- JavaScript 身份证号有效验证详解及实例代码
这篇文章主要介绍了JavaScript 身份证号有效验证详解及实例代码的相关资料,需要的朋友可以参考下 JavaScript验证身份证号 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- 希尔排序基础java代码_java 算法之希尔排序详解及实现代码
摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...
最新文章
- 手把手教你架构3d游戏引擎pdf_一个在游戏行业摸爬滚打了十几年的人,为何我对这本书情有独钟...
- 奇异值分解SVD和偏最小二乘奇异值分解PLSSVD
- 2018新年快乐 !(附幸运读者名单)
- git在项目中的实际运用
- 011 吃药call功能分析和代码编写
- C语言多维数组做函数参数技术推演
- Redis数据类型--列表类型
- java虚拟机之虚拟机类加载机制
- 【计算机网络】局域网原理与技术(局域网概述、以太网技术、高速以太网、虚拟局域网、无线局域网)
- [SQL Native Client] 命名管道提供程序:无法打开与 Sql Server 的连接[2]
- Golang 25 个保留关键字
- 牛B装备 XSS 漏洞利用工具[使用教程]
- python中url是什么意思_Python中url标签使用详解
- 红米k20pro短接9008_拆解红米Redmi K20Pro,内部结果一目了然
- 学phyton第二天
- eclipse安装及使用
- 迎接互联网的明天--玩转3D Web
- POJ3159 Candies(差分约束)
- django-学习路程之案例(一)
- iOS开发学无止境 - Cell 里的视图控制器