java queue通信_Java -- 使用阻塞队列(BlockingQueue)控制线程通信
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)控制线程通信相关推荐
- 并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池
文章目录 概述 阻塞队列的常用场景 阻塞队列的4种处理方式 JDK 7提供的7个阻塞队列 ArrayBlockingQueue LinkedBlockingQueue PriorityBlocking ...
- java 线程 condition_Java编程中实现Condition控制线程通信
java中控制线程通信的方法 1.传统的方式:利用synchronized关键字来保证同步,结合wait(),notify(),notifyall()控制线程通信.不灵活. 2.利用condition ...
- java 并发队列_JAVA并发编程:阻塞队列BlockingQueue之SynchronousQueue
前面在讲解Executors工厂创建可缓存线程的线程池(newCachedThreadPool)的时候有提到过SynchronousQueue队列,该线程池使用 SynchronousQueue 作为 ...
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- java 阻塞队列 BQ_阻塞队列 BlockingQueue的使用(二)
原 阻塞队列 BlockingQueue的使用(二) BlockingQueue 的核心方法:方法类型抛出异常特殊值阻塞超时 插入add(e)offer(e)put(e)offer(e,time,un ...
- java阻塞队列作用_简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用...
简单理解阻塞队列(BlockingQueue)中的take/put方法以及Condition存在的作用 Condition:可以理解成一把锁的一个钥匙,它既可以解锁(通知放行),又可以加锁(阻塞) n ...
- 抽象同步器AQS应用之--阻塞队列BlockingQueue,如何保证任务一定被消费?
文章目录 1.阻塞队列简介 2. BlockingQueue源码分析 3. 生产者消费者模型如何保证信息不会丢失? 1.阻塞队列简介 1.1 什么是阻塞队列? 阻塞队列是一个队列 ①:当队列是空的,从 ...
- 阻塞队列BlockingQueue源码
JAVA阻塞队列 在学习线程池框架ThreadPoolExecutor时发现线程池的实现依赖到了阻塞队列BlockingQueue,在队列为空时take方法会阻塞当前线程,因此这里以ThreadPoo ...
- 并发编程-concurrent指南-阻塞队列BlockingQueue
阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列. 适用场景: BlockingQueue通常用于一个线程 ...
最新文章
- 鸿蒙系统搁置,华为:我们将坚定的支持安卓生态,鸿蒙系统没有明确上市时间...
- 干货 | extern的用法解析
- maven 整体打包_Spirng boot maven多模块打包不踩坑(示例代码)
- 6.1 文件对象常用方法与属性
- Oracle中for update造成锁表,致使无法删除或更新表内容
- DB2中不同于其它数据库的操作
- GRUB系统引导器恢复
- 京东T9架构师手把手教你怎么写年薪50万的java简历
- 前端-js网页特效(三)动画效果及原理
- 为什么百度快照没有样式
- 软件工程-团队作业2
- 小案例:基于python的动态时钟,带十二时辰和经络养身
- 一个简单的面试题 equals和==的区别
- SQL中的外键约束及多表查询
- 无监督式GAN(infoGAN) matlab实战
- 推荐一款jquery前端插件(zoomify),灯箱效果插件(用于图片看大图的效果),简单易用!
- python写我的世界启动器_的世界(Minecraft)如何自己制作启动器-百度经验
- 术语-EDI:EDI
- Android图灵聊天机器人-薇尔莉特
- 项目经理注意事项(3)---宏观把控
热门文章
- 新的一年,这7个“菜鸟坑”千万别再踩了!
- 程序员!别再盲目刷视频了!坚持做这件事儿,AI 也难不倒你!
- 谁说前端工程师不能成为全栈?
- 天才程序员之陨落:业余项目创业 Cloudflare,公司上市前患病失去自理能力
- 写给那些远程办公程序员的建议!
- 苹果官网下架 iPhone 8 全系;阿里推出“阿里云会议”;深度操作系统 20 BETA 发布 | 极客头条...
- 同心抗疫,IBM中国有限公司致客户的一封信
- 没事爱在线上制造故障?这位程序媛有话说
- 如何在 Python 数据中清洗常用 4 板斧?
- 不敌 Java、C/C++、Python,28 岁 VB 究竟输在了哪?