BlockingQueue的使用 http://www.cnblogs.com/liuling/p/2013-8-20-01.html
BlockingQueue的使用
本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue 是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果 BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作.
使用BlockingQueue的关键技术点如下:
1.BlockingQueue定义的常用方法如下:
1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则报异常
2)offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
3)put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.
4)poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止
2.BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类
1)ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的.
2)LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的
BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含
的对象是以FIFO(先入先出)顺序排序的
3)PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序.
4)SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的.
3.LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致
LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于
ArrayBlockingQueue.
下面是两个使用BlockingQueue的例子:

1 package com.thread;
2 import java.util.concurrent.ArrayBlockingQueue;
3 import java.util.concurrent.BlockingQueue;
4
5 public class BlockingQueueTest {
6 public static void main(String[] args) {
7 final BlockingQueue queue = new ArrayBlockingQueue(3);
8 for(int i=0;i<2;i++){
9 new Thread(){
10 public void run(){
11 while(true){
12 try {
13 Thread.sleep((long)(Math.random()*1000));
14 System.out.println(Thread.currentThread().getName() + "准备放数据!");
15 queue.put(1);
16 System.out.println(Thread.currentThread().getName() + "已经放了数据," +
17 "队列目前有" + queue.size() + "个数据");
18 } catch (InterruptedException e) {
19 e.printStackTrace();
20 }
21
22 }
23 }
24
25 }.start();
26 }
27
28 new Thread(){
29 public void run(){
30 while(true){
31 try {
32 //将此处的睡眠时间分别改为100和1000,观察运行结果
33 Thread.sleep(1000);
34 System.out.println(Thread.currentThread().getName() + "准备取数据!");
35 queue.take();
36 System.out.println(Thread.currentThread().getName() + "已经取走数据," +
37 "队列目前有" + queue.size() + "个数据");
38 } catch (InterruptedException e) {
39 e.printStackTrace();
40 }
41 }
42 }
43
44 }.start();
45 }
46 }


1 package com.thread;
2 import java.util.concurrent.ArrayBlockingQueue;
3 import java.util.concurrent.BlockingQueue;
4 import java.util.concurrent.ExecutorService;
5 import java.util.concurrent.Executors;
6 import java.util.concurrent.locks.Condition;
7 import java.util.concurrent.locks.Lock;
8 import java.util.concurrent.locks.ReentrantLock;
9
10 public class BlockingQueueCondition {
11
12 public static void main(String[] args) {
13 ExecutorService service = Executors.newSingleThreadExecutor();
14 final Business3 business = new Business3();
15 service.execute(new Runnable(){
16
17 public void run() {
18 for(int i=0;i<50;i++){
19 business.sub();
20 }
21 }
22
23 });
24
25 for(int i=0;i<50;i++){
26 business.main();
27 }
28 }
29
30 }
31
32 class Business3{
33 BlockingQueue subQueue = new ArrayBlockingQueue(1);
34 BlockingQueue mainQueue = new ArrayBlockingQueue(1);
35 //这里是匿名构造方法,只要new一个对象都会调用这个匿名构造方法,它与静态块不同,静态块只会执行一次,
36 //在类第一次加载到JVM的时候执行
37 //这里主要是让main线程首先put一个,就有东西可以取,如果不加这个匿名构造方法put一个的话程序就死锁了
38 {
39 try {
40 mainQueue.put(1);
41 } catch (InterruptedException e) {
42 e.printStackTrace();
43 }
44 }
45 public void sub(){
46 try
47 {
48 mainQueue.take();
49 for(int i=0;i<10;i++){
50 System.out.println(Thread.currentThread().getName() + " : " + i);
51 }
52 subQueue.put(1);
53 }catch(Exception e){
54
55 }
56 }
57
58 public void main(){
59
60 try
61 {
62 subQueue.take();
63 for(int i=0;i<5;i++){
64 System.out.println(Thread.currentThread().getName() + " : " + i);
65 }
66 mainQueue.put(1);
67 }catch(Exception e){
68 }
69 }
70 }

BlockingQueue的使用 http://www.cnblogs.com/liuling/p/2013-8-20-01.html的更多相关文章
- http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html
http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html
- json(http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html)
http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html
- http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html
http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html
- http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html
http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html
- http://www.cnblogs.com/draem0507/archive/2013/02/01/2889317.html
http://www.cnblogs.com/draem0507/archive/2013/02/01/2889317.html
- http://www.cnblogs.com/fczjuever/archive/2013/04/05/3000680.html
http://www.cnblogs.com/fczjuever/archive/2013/04/05/3000680.html
- http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
- http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html深入理解Java:SimpleDateFormat安全的时间格式化
http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html
- http://www.cnblogs.com/langtianya/archive/2013/02/01/2889682.html
http://www.cnblogs.com/langtianya/archive/2013/02/01/2889682.html
随机推荐
- 【gcc】warning: control reaches end of non-void function
用gcc编译一个C程序的时候出现这样的警告: warning: control reaches end of non-void function 它的意思是:控制到达非void函数的结尾.就是说你的一 ...
- Dreamweaver CS5个性化设置
Dreamweaver CS5个性化设置 编辑 --> 转到行 显示工具栏(上面包含“新建.保存.保存全部”等按钮) 查看 --> 工具栏 --> 标准 也可右键单击显示菜单 延伸阅 ...
- Word中设置所有西文字体为新罗马
如图所示,不用一个一个设置,在字体里直接设置细纹字体:Times New Roman ,中文字体不用管.
- 【Linux】CentOS7上的一些操作小方法
1.在文件夹目录下删除文件 点击文件,按Delete键删除,就可以把文件删除到回收站中. 2.更改命令窗口的样式 打开命令窗口--->右键---->配置文件---->配置文件首选项
- [置顶]
使用kube-proxy让外部网络访问K8S service的ClusterIP
配置方式 kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是: 修改master的/etc/kubernetes/proxy,把KUBE_ ...
- 设计模式之享元模式(PHP实现)
github地址:https://github.com/ZQCard/design_pattern /** * 减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式, * 它 ...
- 安全小测试:介绍一个简单web安全知识测试的网站
https://websecurity.firebaseapp.com/ 一次测试一共7道题,最后有答案,可以反复做,每次随机抽题
- OpenGL投影矩阵【转】
OpenGL投影矩阵 概述 透视投影 正交投影 概述 计算机显示器是一个2D平面.OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上.GL_PROJECTION矩阵用于该投影变换.首先,它 ...
- JRebel 7.0.10 for intellij IDEA 2017.1
1什么是JRebel? JRebel是一套JavaEE开发工具.JRebel是一款JAVA虚拟机插件,它使得JAVA程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响.JReb ...
- Elasticsearch教程(五) elasticsearch Mapping的创建
一.Mapping介绍 在Elasticsearch中,Mapping是什么? mapping在Elasticsearch中的作用就是约束. 1.数据类型声明 它类似于静态语言中的数据类型声明,比如声 ...