1.BlockingQueue:支持两个附加操作的 Queue,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用。

  2.BlockingQueue 不接受 null 元素。

  3.BlockingQueue 可以是限定容量的。

  4.BlockingQueue 实现是线程安全的。Queue不是线程安全的。因此可以将Blockingqueue用于用于生产者-使用者队列。

  根据Api修改的一个例子,大家可以修改自己体验BlockingQueue的使用

  package test;

  import java.util.concurrent.ArrayBlockingQueue;

  import java.util.concurrent.BlockingQueue;

  /**

  * 生产者

  * @author wasw100

  */

  class Producer implements Runnable {

  private final BlockingQueue queue;

  Producer(BlockingQueue q) {

  queue = q;

  }

  public void run() {

  try {

  for (int i = 0; i < 3; i++) {

  queue.put(produce());

  System.out.println("生产后:"+queue.peek());

  }

  } catch (InterruptedException ex) {

  ex.printStackTrace();

  }

  }

  Character produce() {

  char c = (char) (Math.random() * 26 + 'A');

  System.out.println("生产前:" + c);

  return c;

  }

  }

  /**

  * 消费者

  * @author wasw100

  */

  class Consumer implements Runnable {

  private final BlockingQueue queue;

  Consumer(BlockingQueue q) {

  queue = q;

  }

  public void run() {

  try {

  while (true) {

  consume(queue.take());

  //Thread.sleep(100);

  }

  } catch (InterruptedException ex) {

  ex.printStackTrace();

  }

  }

  void consume(Character c) {

  System.out.println("消费:" + c);

  }

  }

  /**

  * 一个生产者、两个消费者

  *

  * @author wasw100

  */

  class Setup {

  public static void main(String[] args) {

  BlockingQueue q = new ArrayBlockingQueue(1);

  Producer p = new Producer(q);

  Consumer c1 = new Consumer(q);

  Consumer c2 = new Consumer(q);

  new Thread(p).start();

  new Thread(c1).start();

  new Thread(c2).start();

  }

  }

Java中Queue和BlockingQueue的区别相关推荐

  1. java中ArrayList和LinkedList的区别

    首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...

  2. java中的异常种类和区别以及处理机制和区别

    java中的异常种类和区别以及处理机制和区别 按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫 CheckedException 和运行时异常(也叫非强制性异常)也叫 RuntimeExce ...

  3. java中Runnable和Callable的区别

    文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...

  4. java中wait和sleep的区别

    文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...

  5. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  6. Java中重载和复写的区别

    Java中重载和复写的区别 重载(overload) 复写(override) 区别和联系 重载(overload) 函数重载的最突出的例子就是类的构造函数,用户定义一个对象时可能会提供多种参数组合: ...

  7. Java中equals()方法和==的区别分析

    Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...

  8. java is instance of_详谈Java中instanceof和isInstance的区别

    一次性搞定instanceof和isInstance,instanceof和isInstance长的非常像,用法也很类似,先看看这两个的用法: obj.instanceof(class) 也就是说这个 ...

  9. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

最新文章

  1. 消灭 Java 代码的“坏味道”
  2. Windows配置ArUco
  3. [持续更新]UnsatisfiedLinkError常见问题及解决方案
  4. 干货!高容错微服务架构设计思路
  5. 夸克浏览器有没有linux,夸克浏览器怎么样?夸克浏览器使用说明
  6. SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」(亲测)
  7. LUA实现单词替换功能
  8. 助你成为嵌入式高手的100多个软硬件开源项目
  9. Linux系统编程16:进程控制之进程终止以及终止进程的三种情况
  10. 常用JavaScript函数 16 - 30(自我总结)
  11. docker安装redis并将配置文件和数据文件映射到外部
  12. Bootstrap 滚动监听
  13. Java里进制转换(二进制、八进制、十进制、十六进制)
  14. json字符串转成formdata_FormData 数据转化为 json 数据
  15. php time豪秒_PHP精确到毫秒秒杀倒计时实例详解
  16. Prometheus 架构 - 每天5分钟玩转 Docker 容器技术(83)
  17. vue-项目完成的项目报告
  18. 【Java8 新特性 3】java8 supplier
  19. 《沸腾十五年》 豆瓣评分[8.20]覆雨翻云的中国网事; 荡气回肠的产业传奇;虚拟世界的真实讲述;万象网络的还原走笔。...
  20. 禁止浏览器查看源代码

热门文章

  1. 直观讲解一下 RPC 调用和 HTTP 调用的区别!
  2. AI在软硬件开发中的应用落地!
  3. 【pandas学习笔记】Series
  4. 搜索算法,一触即达:GitHub上有个规模最大的开源算法库
  5. AI | 优化背后的数学基础
  6. 机器学习必读TOP 100论文清单:高引用、分类全、覆盖面广丨GitHub 21.4k星
  7. 如何用数学追到完美情人?
  8. 33岁180程序员去相亲,被人嫌弃工资不够高,房子不是学区房,网友炸了!
  9. 清华寒门女孩毕业感言爆火:世界本不公平,你有多努力,就有多特殊!
  10. 爬虫之谷歌浏览器xpath helper插件的安装和使用