JAVA并发,BlockingQuene
BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具。
BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类
1、ArrayBlockingQueue:一个由数组支持的有界阻塞队列,规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的。
2、LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的。
3、PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序。
4、SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的。
LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。
生产者消费者的示例代码:
package com.xt.thinks21_7; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque; /**
* 使用BlockingQuene模拟生产者与消费者
*
* @author Ymmmsick
*
*/
public class BlockingQueneTest { public static void main(String[] args) {
BlockingQueue<String> quene = new LinkedBlockingDeque<String>(2);
ExecutorService es = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
es.execute(new Product(quene, "Thread->" + i));
es.execute(new Consumer(quene));
} es.shutdown();
}
} class Product implements Runnable { private BlockingQueue<String> quene;
private String name; public Product(BlockingQueue<String> quene, String name) {
this.quene = quene;
this.name = name;
} @Override
public void run() {
// TODO Auto-generated method stub
try {
quene.put(name);
System.out.println("Product :" + name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } class Consumer implements Runnable { private BlockingQueue<String> quene; public Consumer(BlockingQueue<String> quene) {
this.quene = quene;
} @Override
public void run() {
// TODO Auto-generated method stub
try {
String t = quene.take();
System.out.println("Consumer:" + t);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
输出结果:
Product :Thread->0
Consumer:Thread->0
Product :Thread->1
Product :Thread->2
Consumer:Thread->1
Consumer:Thread->2
Product :Thread->3
Consumer:Thread->3
Product :Thread->4
Consumer:Thread->4
Product :Thread->5
Consumer:Thread->5
Product :Thread->6
Consumer:Thread->6
Product :Thread->7
Consumer:Thread->7
Product :Thread->8
Consumer:Thread->8
Product :Thread->9
Consumer:Thread->9
结论:LinkedBlockingQuene在同一时间段内最多只能保持两个对象在队列,对象溢满的时候生产者会等待阻塞,对象空置的时候消费者会等待阻塞。
JAVA并发,BlockingQuene的更多相关文章
- 多线程的通信和同步(Java并发编程的艺术--笔记)
		1. 线程间的通信机制 线程之间通信机制有两种: 共享内存.消息传递. 2. Java并发 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式执行,通信的过程对于程序员来说是完全透 ... 
- 【Java并发编程实战】----- AQS(四):CLH同步队列
		在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ... 
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
		在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ... 
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
		上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ... 
- 【Java并发编程实战】-----“J.U.C”:CLH队列锁
		在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ... 
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
		上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ... 
- 【Java并发编程实战】-----“J.U.C”:CyclicBarrier
		在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ... 
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
		ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ... 
- Java并发编程:volatile关键字解析
		Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ... 
- JAVA并发编程J.U.C学习总结
		前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ... 
随机推荐
- Spring-----自定义属性编辑器
			转载自:http://blog.csdn.net/hekewangzi/article/details/51712963 
- zoj1107 FatMouse and Cheese
			这是一道记忆化搜索,也就是有记录的搜索. 注意点:一次走k步不能拐弯 int bfs(int x,int y) { ; ) return ans[x][y]; ;i<;i++) { ;j< ... 
- 关于css3的背景切割(background-clip)、背景原点(background-origin)的使用
			一.背景切割 background-clip :border-box | padding-box | content-box 作用:为将背景图片做适当的裁剪,以适应需要. 默认格式 bac ... 
- Android 软键盘小知识点
			chatText = (EditText) findViewById(R.id.chatText); chatText.setOnKeyListener(new OnKeyListener() { p ... 
- 自动注册服务NET Core扩展IServiceCollection
			NET Core扩展IServiceCollection自动注册服务 前言 在ASP.NET Core中使用依赖注入中使用很简单,只需在Startup类的ConfigureServices()方法中, ... 
- Java日期时间使用(转)
			Java日期时间使用总结 转自:http://lavasoft.blog.51cto.com/62575/52975/ 一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个 ... 
- keil mdk中如何确保某一段程序不被优化掉
			使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在ROM的0x00002000处定位了一个函数,假设为vo ... 
- Coursera-Neural Networks by Geoffrey Hinton
			feed-forward networks symmetrically-connection neural networks 
- naive bayes
			场景:垃圾邮件预测 目标: $p(y|w) = \frac{p(w|y)p(y)}{p(w)}$ 对于一封邮件来说,它的单词相同,所以$p(w)$可以不关心,计算得到分子就能知道更属于哪一类 所以,关 ... 
- mysql中使用正则表达式时的注意事项
			mysql不支持\d元字符匹配数字 mysql不支持向前.向后查找 regexp不能和not搭配使用 
