Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 240|回复: 0

[Java线程学习]BlockingQueue队列详解

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-30 23:58:28 | 显示全部楼层 |阅读模式
    本例介绍一个特殊的队列:BlockingQueue,如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒,同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间时才会被唤醒继续操作。

       本例实现一个篮子程序,不过这个篮子中最多能放得苹果数不是1,可以随意指定。当篮子满时,生产者进入等待状态,当篮子空时,消费者等待。


    BlockingQueue定义的常用方法如下:

    add(anObject):
         把anObject加到BlockingQueue里,如果BlockingQueue可以容纳,则返回true,否则抛出异常。  
      
       
       

         
       

         
       
      
      offer(anObject):
         表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false。

    put(anObject):
          把anObject加到BlockingQueue里,如果BlockingQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里有空间再继续。

    poll(time):
         取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null。

    take():
          取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的对象被加入为止。  BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类:

    ArrayBlockingQueue:
         规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小。其所含的对象是以FIFO(先入先出)顺序排序的。

    LinkedBlockingQueue:
          大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO顺序排序的。

    PriorityBlockingQueue:
          类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的
    Comparator决定的顺序。

    SynchronousQueue:
        特殊的BlockingQueue,对其的操作必须是放和取交替完成的。  LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue。


    * 下面是用BlockingQueue来实现Producer和Consumer的例子
    1. import java.util.concurrent.ArrayBlockingQueue;  
    2. import java.util.concurrent.BlockingQueue;  
    3. import java.util.concurrent.ExecutorService;  
    4. import java.util.concurrent.Executors;  
    5. public class BlockingQueueTest {  
    6.   
    7.     /** *//**
    8.      * 定义装苹果的篮子
    9.      */  
    10.     public static class Basket{  
    11.         // 篮子,能够容纳3个苹果   
    12.         BlockingQueue
    13.    basket = new ArrayBlockingQueue< String>(3);  
    14.          
    15.         // 生产苹果,放入篮子   
    16.         public void produce() throws InterruptedException{  
    17.             // put方法放入一个苹果,若basket满了,等到basket有位置   
    18.             basket.put("An apple");  
    19.         }  
    20.         // 消费苹果,从篮子中取走   
    21.         public String consume() throws InterruptedException{  
    22.             // get方法取出一个苹果,若basket为空,等到basket有苹果为止   
    23.             return basket.take();  
    24.         }  
    25.     }  
    26.     // 测试方法   
    27.     public static void testBasket() {  
    28.         // 建立一个装苹果的篮子   
    29.         final Basket basket = new Basket();  
    30.         // 定义苹果生产者   
    31.         class Producer implements Runnable {  
    32.             public void run() {  
    33.                 try {  
    34.                     while (true) {  
    35.                         // 生产苹果   
    36.                         System.out.println("生产者准备生产苹果:"   
    37.                                 + System.currentTimeMillis());  
    38.                         basket.produce();  
    39.                         System.out.println("生产者生产苹果完毕:"   
    40.                                 + System.currentTimeMillis());  
    41.                         // 休眠300ms   
    42.                         Thread.sleep(300);  
    43.                     }  
    44.                 } catch (InterruptedException ex) {  
    45.                 }  
    46.             }  
    47.         }  
    48.         // 定义苹果消费者   
    49.         class Consumer implements Runnable {  
    50.             public void run() {  
    51.                 try {  
    52.                     while (true) {  
    53.                         // 消费苹果   
    54.                         System.out.println("消费者准备消费苹果:"   
    55.                                 + System.currentTimeMillis());  
    56.                         basket.consume();  
    57.                         System.out.println("消费者消费苹果完毕:"   
    58.                                 + System.currentTimeMillis());  
    59.                         // 休眠1000ms   
    60.                         Thread.sleep(1000);  
    61.                     }  
    62.                 } catch (InterruptedException ex) {  
    63.                 }  
    64.             }  
    65.         }  
    66.          
    67.         ExecutorService service = Executors.newCachedThreadPool();  
    68.         Producer producer = new Producer();  
    69.         Consumer consumer = new Consumer();  
    70.         service.submit(producer);  
    71.         service.submit(consumer);  
    72.         // 程序运行5s后,所有任务停止   
    73.         try {  
    74.             Thread.sleep(5000);  
    75.         } catch (InterruptedException e) {  
    76.         }  
    77.         service.shutdownNow();  
    78.     }  
    79.   
    80.     public static void main(String[] args) {  
    81.         BlockingQueueTest.testBasket();  
    82.     }  
    83. }  
    复制代码
    C:java>javac BlockingQueueTest.java C:java>java BlockingQueueTest
    生产者准备生产苹果:1356400720843
    生产者生产苹果完毕:1356400720843
    消费者准备消费苹果:1356400720843
    消费者消费苹果完毕:1356400720859
    生产者准备生产苹果:1356400721156
    生产者生产苹果完毕:1356400721156
    生产者准备生产苹果:1356400721468
    生产者生产苹果完毕:1356400721484
    生产者准备生产苹果:1356400721796
    生产者生产苹果完毕:1356400721812
    消费者准备消费苹果:1356400721859
    消费者消费苹果完毕:1356400721875
    生产者准备生产苹果:1356400722125
    生产者生产苹果完毕:1356400722140
    生产者准备生产苹果:1356400722468
    消费者准备消费苹果:1356400722890
    消费者消费苹果完毕:1356400722906
    生产者生产苹果完毕:1356400722921
    生产者准备生产苹果:1356400723234
    消费者准备消费苹果:1356400723921
    生产者生产苹果完毕:1356400723937
    消费者消费苹果完毕:1356400723953
    生产者准备生产苹果:1356400724250
    消费者准备消费苹果:1356400724968
    生产者生产苹果完毕:1356400724984
    消费者消费苹果完毕:1356400724984
    生产者准备生产苹果:1356400725296 C:java>


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/30/235828546.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-6 03:37 , Processed in 0.460224 second(s), 49 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表