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的更多相关文章

  1. http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html

    http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html

  2. json(http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html)

    http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html

  3. http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html

    http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html

  4. http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html

    http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html

  5. http://www.cnblogs.com/draem0507/archive/2013/02/01/2889317.html

    http://www.cnblogs.com/draem0507/archive/2013/02/01/2889317.html

  6. http://www.cnblogs.com/fczjuever/archive/2013/04/05/3000680.html

    http://www.cnblogs.com/fczjuever/archive/2013/04/05/3000680.html

  7. http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

    http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

  8. http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html深入理解Java:SimpleDateFormat安全的时间格式化

    http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html

  9. http://www.cnblogs.com/langtianya/archive/2013/02/01/2889682.html

    http://www.cnblogs.com/langtianya/archive/2013/02/01/2889682.html

随机推荐

  1. Redis(二)linux下redis安装

    上篇讲解了redis在windows下的安装,接下来看看在linux下如何安装redis(纯菜鸟入门级别)? (1)redis的下载及编译 这里,首先进入存放文件目录(我的云服务器的是:cd /jel ...

  2. ARM常用汇编指令介绍

    b     跳转指令(跳转范围为32Mb) bl    带返回地址的跳转,指令自动将下一条指令的地址复制到R14寄存器,然后跳转到指定地址去执行,执行完后返回到下一条指令处执行 pc    寄存器R1 ...

  3. mysql-essential-5.1.55-win32 安装

    1.选择无事物安装 2.my.cnf [mysqld] default-storage-engine=INNODB innodb=on 3.设置数据目录 手动创建目录 D:\data [mysqld] ...

  4. 项目中的.Net

    一.@符号的妙用 1.字符串转义符     源:'\'在C#中是特殊符号,表示转义字符,所有要表示普通字符串'\',则需要用'\\',通过@符号,可以实现'\'当做普通字符使用,如下:     str ...

  5. Kubernetes 针对资源紧缺处理方式的配置

    如何在资源紧缺的情况下,保证 Node 的稳定性,是 Kubelet 需要面对的一个重要的问题.尤其对于内存和磁盘这种不可压缩的资源,紧缺就相当于不稳定. 在kubelet启动作为参数或者在配置文件中 ...

  6. 使用Intent调用内置应用程序

    布局代码如下: <?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:and ...

  7. Window mode

    D3D window mode:Upper left (0,0)是左上角 OGL window mode:Lower left(0,0)是左下角 nvn API nvn::Device::SetWin ...

  8. 全国省会城市路网以及POI 数据

  9. Python 面向对象三(转载)

    来源:Mr.Seven www.cnblogs.com/wupeiqi/p/4766801.html 四.类的特殊成员 上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段.方法和属性三 ...

  10. tez参数

    https://tez.apache.org/releases/0.8.4/tez-api-javadocs/configs/TezConfiguration.html