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

阻塞队列和非阻塞队列相关推荐

  1. 让人一看就会的java阻塞队列与非阻塞队列

    队列介绍 今天要来讲一下java里的队列,队列,顾名思义,排队的列,既然按排队形来做的话,生活中的银行排队啊,上车排队啊,都是先到先办理或者先上车,队列存取数据列也一样,这就是先进先出,使用队列的规则 ...

  2. 阻塞队列和非阻塞队列(JAVA)

    文章目录 1.阻塞队列 1.1 代码举例 1.2 LinkedBlockingQueue 2.非阻塞队列 2.1 代码举例 2.2 ConcurrentLinkedQueue 1.阻塞队列 1.1 代 ...

  3. java之阻塞队列和非阻塞队列

    目录 一.什么是阻塞队列 二.阻塞队列种类分析 三.非阻塞队列 Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子 ...

  4. 阻塞io阻塞io_Redis:RESP协议,阻塞IO 与非阻塞IO,Redis的线程模型

    1.Redis 阻塞IO 与非阻塞IO Java在JDK1.4 中引入了NIO ,但是也有很多人在使用阻塞IO,这两种IO有什么区别? 在阻塞模式下,如果你从数据流读取不到指定大小的数据量,IO就会阻 ...

  5. 嵌入式驱动之阻塞操作、非阻塞操作

    阻塞 阻塞操作     是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作. 被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足. 非阻塞操作   进 ...

  6. 5种网络IO模型:阻塞IO、非阻塞IO、异步IO、多路复用IO、信号驱动IO

    目录 前言 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) 模型间的区别 ...

  7. 阻塞IO、非阻塞IO、以及多路复用原理

    阻塞IO.非阻塞IO.以及多路复用原理 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 阻塞IO.非阻塞IO.以及多路复用原理 什么是I/O 一.BIO(阻塞IO) 二.N ...

  8. 阻塞IO、非阻塞IO的区别

    阻塞IO.非阻塞IO的区别 1.类与类之间的关系:依赖,实现,泛化(继承),关联,组合,聚合. 1)依赖(虚线):一个类是 另一个类的函数参数 或者 函数返回值. 2)实现(实线加小圆):对纯虚函数类 ...

  9. 硅芯思见:阻塞赋值与非阻塞赋值

    0 丑话说在前边 RHS:运算符(= or <=)右侧的表达式 LHS:运算符(= or <=)左侧的表达式 竞争(Race Condition):在同一仿真时间槽(time-slot)多 ...

最新文章

  1. 小学生也能看懂的微服务节点判活难题
  2. 排序(3)---------冒泡排序(C语言实现)
  3. php篮球比赛,篮球数据API接口 - 【篮球比赛动画直播变化数据】API调用示例代码...
  4. Filter案例之敏感词过滤和代理模式
  5. javaone_Javaone 2013评论
  6. 固定 顶部_纹络型温室大棚顶部通风样式及效率对比
  7. xcode4.3.2 arc模式下导入非arc的文件 转
  8. Java关闭窗口和刷新
  9. tensorflow分布式运行
  10. Rhel6服务器日志浅谈
  11. python中sorted_关于python中sorted方法的key参数
  12. 滴滴+头条+网易游戏研发面经
  13. A股和债市短期看好,后期需提防回调,建议逐步减仓观望
  14. 设置html字体大小 js,js如何改变文章的字体大小
  15. ssm基于微信平台的牙科就诊信息管理系统的设计与实现 毕业设计源码211157
  16. 基于html5贪吃蛇小游戏,H5 canvas实现贪吃蛇小游戏
  17. egret eui.Button改变文本、背景色及是否可点击
  18. Obi Fluid Emitter使用简介
  19. HyperLynx(十二)BoardSim和PCB板级仿真分析(三)
  20. 西门子SMART200 通过Modbus 读取温湿度传感器数据实例

热门文章

  1. 自动驾驶,离真正量产还差什么?
  2. Altium Designer PCB板中各层的作用
  3. Lubuntu纯小白级别安装配置
  4. vue实现全屏登录视频背景并适配浏览器窗口大小
  5. 关于生活垃圾分类,可以使用垃圾分类小程序进行辅助识别
  6. Editable与String有什么区别
  7. 电子工程师计算机相关论文题目,电子工程师论文范文
  8. Java循环语句详解(Java必备知识)
  9. 写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实
  10. 微信公众号注销【已解决】