阻塞队列和非阻塞队列
1.阻塞队列和非阻塞队列的区别:阻塞队列可以阻塞,非阻塞队列不能阻塞,只能使用队列wait(),notify()进行队列消息传送。而阻塞队列当队列里面没有值时,会阻塞直到有值输入。输入也一样,当队列满的时候,会阻塞,直到队列不为空。
2.阻塞队列
ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。并且可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。
LinkedBlockingQueue:基于链表实现的一个阻塞队列,在创建LinkedBlockingQueue对象时如果不指定容量大小,则默认大小为Integer.MAX_VALUE。
PriorityBlockingQueue:以上2种队列都是先进先出队列,而PriorityBlockingQueue却不是,它会按照元素的优先级对元素进行排序,按照优先级顺序出队,每次出队的元素都是优先级最高的元素。注意,此阻塞队列为无界阻塞队列,即容量没有上限(通过源码就可以知道,它没有容器满的信号标志),前面2种都是有界队列。
DelayQueue:基于PriorityQueue,一种延时阻塞队列,DelayQueue中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。DelayQueue也是一个无界队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞。
3.阻塞队列和非阻塞队列的方法
1.非阻塞队列中的几个主要方法:
add(E e):将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则会抛出异常;
remove():移除队首元素,若移除成功,则返回true;如果移除失败(队列为空),则会抛出异常;
offer(E e):将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则返回false;
poll():移除并获取队首元素,若成功,则返回队首元素;否则返回null;
peek():获取队首元素,若成功,则返回队首元素;否则返回null
对于非阻塞队列,一般情况下建议使用offer、poll和peek三个方法,不建议使用add和remove方法。因为使用offer、poll和peek三个方法可以通过返回值判断操作成功与否,而使用add和remove方法却不能达到这样的效果。注意,非阻塞队列中的方法都没有进行同步措施。
2.阻塞队列中的几个主要方法:
阻塞队列包括了非阻塞队列中的大部分方法,上面列举的5个方法在阻塞队列中都存在,但是要注意这5个方法在阻塞队列中都进行了同步措施。
除此之外,阻塞队列提供了另外4个非常有用的方法:
put(E e)
take()
offer(E e,long timeout, TimeUnit unit)
poll(long timeout, TimeUnit unit)
这四个方法的理解:
put方法用来向队尾存入元素,如果队列满,则等待;
take方法用来从队首取元素,如果队列为空,则等待;
offer方法用来向队尾存入元素,如果队列满,则等待一定的时间,当时间期限达到时,如果还没有插入成功,则返回false;否则返回true;
poll方法用来从队首取元素,如果队列空,则等待一定的时间,当时间期限达到时,如果取到,则返回null;否则返回取得的元素;
4.demo
阻塞队列
package com.example.demo;import java.util.concurrent.ArrayBlockingQueue;/*** @program: test* @description* @author: dajitui* @create: 2018-06-21 11:26**/
public class zusheQueue {private int queueSize = 10;private ArrayBlockingQueue<Integer> queue =new ArrayBlockingQueue<Integer>(queueSize);public static void main(String[] args) {zusheQueue test = new zusheQueue();Producer producer = test.new Producer();Consumer consumer = test.new Consumer();producer.start();consumer.start();}class Consumer extends Thread{@Overridepublic void run() {consume();}private void consume() {while(true){try {queue.take();System.out.println("从队列取走一个元素,队列剩余"+queue.size()+"个元素");} catch (InterruptedException e) {e.printStackTrace();}}}}class Producer extends Thread{@Overridepublic void run() {produce();}private void produce() {while(true){try {queue.put(1);System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));} catch (InterruptedException e) {e.printStackTrace();}}}}
}
非阻塞队列
package com.example.demo;import java.util.PriorityQueue;import static com.example.demo.RateLimiterDemo.A;/*** @program: test* @description* @author: dajitui* @create: 2018-06-21 10:59**/
public class feizusheQueue
{private int queueSize = 10;private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);public static void main(String[] args) {feizusheQueue test = new feizusheQueue ();Producer producer = test.new Producer();Consumer consumer = test.new Consumer();producer.start();consumer.start();}class Consumer extends Thread{@Overridepublic void run() {consume();}private void consume() {while(true){synchronized (queue) {while(queue.size() == 0){try {System.out.println("队列空,等待数据");queue.wait();} catch (InterruptedException e) {e.printStackTrace();queue.notify();}}queue.poll(); //每次移走队首元素queue.notify();System.out.println("从队列取走一个元素,队列剩余"+queue.size()+"个元素");}}}}class Producer extends Thread{@Overridepublic void run() {produce();}private void produce() {while(true){synchronized (queue) {while(queue.size() == queueSize){try {System.out.println("队列满,等待有空余空间");queue.wait();} catch (InterruptedException e) {e.printStackTrace();queue.notify();}}queue.offer(1); //每次插入一个元素queue.notify();System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));}}}}
}
可以看到阻塞队列不需要synchronized,或者调用wait(),notify()来进行队列交互。
转发链接https://mp.weixin.qq.com/s?__biz=MzAxNjM2MTk0Ng==&mid=2247484440&idx=1&sn=9725e182205cf7629b163ed664c74e7a&chksm=9bf4b4adac833dbbfe1a44b7397ea284fc34c3f38e3a6a344ee5beb5e71de155c484f4c1d0a8&mpshare=1&scene=2&srcid=0614mUIZXCRzz8REvuO0K4OE&from=timeline#rd
阻塞队列和非阻塞队列相关推荐
- 让人一看就会的java阻塞队列与非阻塞队列
队列介绍 今天要来讲一下java里的队列,队列,顾名思义,排队的列,既然按排队形来做的话,生活中的银行排队啊,上车排队啊,都是先到先办理或者先上车,队列存取数据列也一样,这就是先进先出,使用队列的规则 ...
- 阻塞队列和非阻塞队列(JAVA)
文章目录 1.阻塞队列 1.1 代码举例 1.2 LinkedBlockingQueue 2.非阻塞队列 2.1 代码举例 2.2 ConcurrentLinkedQueue 1.阻塞队列 1.1 代 ...
- java之阻塞队列和非阻塞队列
目录 一.什么是阻塞队列 二.阻塞队列种类分析 三.非阻塞队列 Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子 ...
- 阻塞io阻塞io_Redis:RESP协议,阻塞IO 与非阻塞IO,Redis的线程模型
1.Redis 阻塞IO 与非阻塞IO Java在JDK1.4 中引入了NIO ,但是也有很多人在使用阻塞IO,这两种IO有什么区别? 在阻塞模式下,如果你从数据流读取不到指定大小的数据量,IO就会阻 ...
- 嵌入式驱动之阻塞操作、非阻塞操作
阻塞 阻塞操作 是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作. 被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足. 非阻塞操作 进 ...
- 5种网络IO模型:阻塞IO、非阻塞IO、异步IO、多路复用IO、信号驱动IO
目录 前言 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) 模型间的区别 ...
- 阻塞IO、非阻塞IO、以及多路复用原理
阻塞IO.非阻塞IO.以及多路复用原理 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 阻塞IO.非阻塞IO.以及多路复用原理 什么是I/O 一.BIO(阻塞IO) 二.N ...
- 阻塞IO、非阻塞IO的区别
阻塞IO.非阻塞IO的区别 1.类与类之间的关系:依赖,实现,泛化(继承),关联,组合,聚合. 1)依赖(虚线):一个类是 另一个类的函数参数 或者 函数返回值. 2)实现(实线加小圆):对纯虚函数类 ...
- 硅芯思见:阻塞赋值与非阻塞赋值
0 丑话说在前边 RHS:运算符(= or <=)右侧的表达式 LHS:运算符(= or <=)左侧的表达式 竞争(Race Condition):在同一仿真时间槽(time-slot)多 ...
最新文章
- 小学生也能看懂的微服务节点判活难题
- 排序(3)---------冒泡排序(C语言实现)
- php篮球比赛,篮球数据API接口 - 【篮球比赛动画直播变化数据】API调用示例代码...
- Filter案例之敏感词过滤和代理模式
- javaone_Javaone 2013评论
- 固定 顶部_纹络型温室大棚顶部通风样式及效率对比
- xcode4.3.2 arc模式下导入非arc的文件 转
- Java关闭窗口和刷新
- tensorflow分布式运行
- Rhel6服务器日志浅谈
- python中sorted_关于python中sorted方法的key参数
- 滴滴+头条+网易游戏研发面经
- A股和债市短期看好,后期需提防回调,建议逐步减仓观望
- 设置html字体大小 js,js如何改变文章的字体大小
- ssm基于微信平台的牙科就诊信息管理系统的设计与实现 毕业设计源码211157
- 基于html5贪吃蛇小游戏,H5 canvas实现贪吃蛇小游戏
- egret eui.Button改变文本、背景色及是否可点击
- Obi Fluid Emitter使用简介
- HyperLynx(十二)BoardSim和PCB板级仿真分析(三)
- 西门子SMART200 通过Modbus 读取温湿度传感器数据实例