BlockingQueeu接口是Queue的子接口,但是它的主要作用并不是作为容器,而是作为线程同步的工具。

特征:

当生产者线程试图向BlockingQueue中放入元素时,如果该队列已满,则该线程被阻塞;当消费者线程试图从BlockingQueue中取出元素时,如果该队列已空,则该线程被阻塞。

程序的两个线程通过交替从BlockingQueue中放入元素、取出元素,即可很好地控制线程的通信。

BlockingQueue提供如下两个支持阻塞的方法:

put(E e):尝试从BlockingQueue的头部取出元素,如果该队列的元素已满,则阻塞该线程。

take():尝试从BlockingQueue的头部取出元素,如果该队列的元素已空,则阻塞该线程。

BlockingQueue继承了Queue接口,当然也可以使用Queue接口的方法。这些方法归纳起来可分为3组:

在队列尾部插入元素。包括add(E e)、offer(E e)和put(E e)方法,当该队列已满时,这3个方法分别抛出异常、返回false、阻塞队列。

在队列头部删除并返回删除的元素。包括remove()、poll()和take()方法。当该队列已空时,这3个方法分别抛出异常、返回false、阻塞队列。

在队列头部取出但是不删除元素。包括element()和peek()方法,当队列已空时,这两个方法分别抛出异常、返回false。

BlockingQueue队列的5个实现类:

ArrayBlockingQueue:基于数组实现的BlockingQueue队列

LinkedBlockingQueue:基于链表实现的BlockingQueue队列

PriorityBlockingQueue:.....

SynchronousQueue:同步队列。对对垒的存、取操作必须交替进行

DelayQueue:.....

具体代码示例:

packagecom.fuchenggang.blockingqueue;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.BlockingQueue;/*** @ClassName: Producer

* @Description: 生产者

*@authorfucg@kunyitech.com

* @date 2015年7月10日 下午4:08:03*/

class Producer extendsThread {private BlockingQueuebq;public Producer(BlockingQueuebq) {this.bq =bq;

}

@Overridepublic voidrun() {

String[] strArr= newString[]

{"Java","Struts","Spring"};for (int i = 0; i < 999999999; i++) {

System.out.println(getName()+ "生产者准备生产集合元素!");try{

Thread.sleep(200);//尝试放入元素,如果队列已满,则线程被阻塞

bq.put(strArr[i%3]);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println(getName()+ "生产完成:" +bq);

}

}

}/*** @ClassName: Consumer

* @Description: 消费者

*@authorfucg@kunyitech.com

* @date 2015年7月10日 下午4:08:19*/

class Consumer extendsThread{private BlockingQueuebq;public Consumer(BlockingQueuebq) {this.bq =bq;

}

@Overridepublic voidrun() {while (true) {

System.out.println(getName()+ "消费者准备消费集合元素");try{

Thread.sleep(200);//尝试取出元素,如果队列已空,则线程被阻塞

bq.take();

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println(getName()+ "消费完成:" +bq);

}

}

}/*** @ClassName: BlockingQueueTest2

* @Description: 测试生产者线程和消费者线程的通信

*@authorfucg@kunyitech.com

* @date 2015年7月10日 下午4:13:37*/

public classBlockingQueueTest2 {public static voidmain(String[] args) {//创建一个容器为1的BlockingQueue

BlockingQueue bq = new ArrayBlockingQueue(1);//启动3个生产者线程

newProducer(bq).start();newProducer(bq).start();newProducer(bq).start();//启动1个消费者线程

newConsumer(bq).start();

}

}

代码讲解:

程序启动了3个生产者线程向BolckingQueue集合放入元素,启动了1个消费者线程从BlockingQueue集合中取出元素。本程序的BlockingQueue集合容量为1,因此3个生产者线程无法连续放入元素,必须等待消费者线程取出一个元素后,3个生产者线程之一才能放入一个元素。

运行结果:

java queue通信_Java -- 使用阻塞队列(BlockingQueue)控制线程通信相关推荐

  1. 并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池

    文章目录 概述 阻塞队列的常用场景 阻塞队列的4种处理方式 JDK 7提供的7个阻塞队列 ArrayBlockingQueue LinkedBlockingQueue PriorityBlocking ...

  2. java 线程 condition_Java编程中实现Condition控制线程通信

    java中控制线程通信的方法 1.传统的方式:利用synchronized关键字来保证同步,结合wait(),notify(),notifyall()控制线程通信.不灵活. 2.利用condition ...

  3. java 并发队列_JAVA并发编程:阻塞队列BlockingQueue之SynchronousQueue

    前面在讲解Executors工厂创建可缓存线程的线程池(newCachedThreadPool)的时候有提到过SynchronousQueue队列,该线程池使用 SynchronousQueue 作为 ...

  4. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例

    Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...

  5. java 阻塞队列 BQ_阻塞队列 BlockingQueue的使用(二)

    原 阻塞队列 BlockingQueue的使用(二) BlockingQueue 的核心方法:方法类型抛出异常特殊值阻塞超时 插入add(e)offer(e)put(e)offer(e,time,un ...

  6. java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...

    简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用 Condition:可以理解成一把锁的一个钥匙,它既可以解锁(通知放行),又可以加锁(阻塞) n ...

  7. 抽象同步器AQS应用之--阻塞队列BlockingQueue,如何保证任务一定被消费?

    文章目录 1.阻塞队列简介 2. BlockingQueue源码分析 3. 生产者消费者模型如何保证信息不会丢失? 1.阻塞队列简介 1.1 什么是阻塞队列? 阻塞队列是一个队列 ①:当队列是空的,从 ...

  8. 阻塞队列BlockingQueue源码

    JAVA阻塞队列 在学习线程池框架ThreadPoolExecutor时发现线程池的实现依赖到了阻塞队列BlockingQueue,在队列为空时take方法会阻塞当前线程,因此这里以ThreadPoo ...

  9. 并发编程-concurrent指南-阻塞队列BlockingQueue

    阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列. 适用场景: BlockingQueue通常用于一个线程 ...

最新文章

  1. 鸿蒙系统搁置,华为:我们将坚定的支持安卓生态,鸿蒙系统没有明确上市时间...
  2. 干货 | extern的用法解析
  3. maven 整体打包_Spirng boot maven多模块打包不踩坑(示例代码)
  4. 6.1 文件对象常用方法与属性
  5. Oracle中for update造成锁表,致使无法删除或更新表内容
  6. DB2中不同于其它数据库的操作
  7. GRUB系统引导器恢复
  8. 京东T9架构师手把手教你怎么写年薪50万的java简历
  9. 前端-js网页特效(三)动画效果及原理
  10. 为什么百度快照没有样式
  11. 软件工程-团队作业2
  12. 小案例:基于python的动态时钟,带十二时辰和经络养身
  13. 一个简单的面试题 equals和==的区别
  14. SQL中的外键约束及多表查询
  15. 无监督式GAN(infoGAN) matlab实战
  16. 推荐一款jquery前端插件(zoomify),灯箱效果插件(用于图片看大图的效果),简单易用!
  17. python写我的世界启动器_的世界(Minecraft)如何自己制作启动器-百度经验
  18. 术语-EDI:EDI
  19. Android图灵聊天机器人-薇尔莉特
  20. 项目经理注意事项(3)---宏观把控

热门文章

  1. 新的一年,这7个“菜鸟坑”千万别再踩了!
  2. 程序员!别再盲目刷视频了!坚持做这件事儿,AI 也难不倒你!
  3. 谁说前端工程师不能成为全栈?
  4. 天才程序员之陨落:业余项目创业 Cloudflare,公司上市前患病失去自理能力
  5. 写给那些远程办公程序员的建议!
  6. 苹果官网下架 iPhone 8 全系;阿里推出“阿里云会议”;深度操作系统 20 BETA 发布 | 极客头条...
  7. 同心抗疫,IBM中国有限公司致客户的一封信
  8. 没事爱在线上制造故障?这位程序媛有话说
  9. 如何在 Python 数据中清洗常用 4 板斧?
  10. 不敌 Java、C/C++、Python,28 岁 VB 究竟输在了哪?