`

特殊的队列:BlockingQueue 使用(转)

 
阅读更多
本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作.
    本例再次实现11.4线程----条件Condition中介绍的篮子程序,不过这个篮子中最多能放的苹果数不是1,可以随意指定.当篮子满时,生产者进入等待状态,当篮子空时,消费者等待.



    使用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.



[java] view plaincopyprint?

    import java.util.concurrent.ArrayBlockingQueue; 
    import java.util.concurrent.BlockingQueue; 
    import java.util.concurrent.ExecutorService; 
    import java.util.concurrent.Executors; 
      
    public class BlockingQueueTest { 
           /**定义装苹果的篮子*/ 
           public static class Basket{ 
                  //篮子,能够容纳3个苹果 
                  BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3); 
                  //生产苹果,放入篮子 
                  public void produce() throws InterruptedException{ 
                         //put方法放入一个苹果,若basket满了,等到basket有位置 
                         basket.put("An apple"); 
                  } 
                  //消费苹果,从篮子中取走 
                  public String consume() throws InterruptedException{ 
                         //take方法取出一个苹果,若basket为空,等到basket有苹果为止 
                         return basket.take(); 
                  } 
           } 
           //测试方法 
           public static void testBasket(){ 
                  final Basket basket = new Basket();//建立一个装苹果的篮子 
                  //定义苹果生产者 
                  class Producer implements Runnable{ 
                         public void run(){ 
                                try{ 
                                       while(true){ 
                                              //生产苹果 
                                              System.out.println("生产者准备生产苹果: " + System.currentTimeMillis()); 
                                              basket.produce(); 
                                              System.out.println("生产者生产苹果完毕: " + System.currentTimeMillis()); 
                                              //休眠300ms 
                                              Thread.sleep(300); 
                                       } 
                                }catch(InterruptedException ex){ 
                                } 
                         } 
                  } 
                  //定义苹果消费者 
                  class Consumer implements Runnable{ 
                         public void run(){ 
                                try{ 
                                       while(true){ 
                                              //消费苹果 
                                              System.out.println("消费者准备消费苹果: " + System.currentTimeMillis()); 
                                              basket.consume(); 
                                              System.out.println("消费者消费苹果完毕: " + System.currentTimeMillis()); 
                                              //休眠1000ms 
                                              Thread.sleep(1000); 
                                       } 
                                }catch(InterruptedException ex){ 
                                } 
                         } 
                  } 
                  ExecutorService service = Executors.newCachedThreadPool(); 
                  Producer producer = new Producer(); 
                  Consumer consumer = new Consumer(); 
                  service.submit(producer); 
                  service.submit(consumer); 
                  //程序运行5s后,所有任务停止 
                  try{ 
                         Thread.sleep(5000); 
                  }catch(InterruptedException ex){ 
                  } 
                  service.shutdownNow(); 
           } 
           public static void main(String[] args){ 
                  BlockingQueueTest.testBasket(); 
           } 
    } 
分享到:
评论

相关推荐

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...

    BlockingQueue(阻塞队列)详解

    - **定义**:阻塞队列是一种特殊的队列,除了具有队列的基本特性外,还提供了额外的阻塞行为,即当队列空时,从队列中获取元素的操作将会阻塞,等待队列变得非空;当队列满时,向队列插入元素的操作也会阻塞,等待...

    BlockingQueue队列自定义超时时间取消线程池任务

    现在我们来详细讨论如何利用这些技术实现“BlockingQueue队列自定义超时时间取消线程池任务”。 首先,`BlockingQueue`是一个并发容器,它遵循先进先出(FIFO)原则,具有阻塞性质,当队列满时,生产者线程会被阻塞...

    队列:队列在线程池等有限资源池中的应用.pdf

    1. **顺序队列**:使用数组实现。数组的一端作为队头,另一端作为队尾。当有新元素加入时,将其添加到队尾;当需要移除元素时,则从队头移除。 - **示例代码**: ```java public class ArrayQueue { private ...

    spring-blockingqueue:用Spring Boot阻止队列

    当我们谈论"Spring BlockingQueue"时,我们实际上是在讨论如何在Spring Boot应用中使用Java并发库中的BlockingQueue接口。 BlockingQueue是一种线程安全的数据结构,它在多线程环境下的数据共享和通信中扮演着关键...

    BlockingQueue的使用

    BlockingQueue是Java并发编程中非常重要的一个数据结构,它是一个具有阻塞特性的队列,主要用于线程间的协作。在多线程环境下,BlockingQueue能够有效地实现生产者-消费者模式,提高了程序的并发性能和效率。本文将...

    java中线程队列BlockingQueue的用法

    - 消息队列中间件如RabbitMQ、Kafka等在Java客户端API中也广泛使用`BlockingQueue`进行消息传递。 总之,`BlockingQueue`是Java并发编程的重要工具,它通过简单的API实现了复杂的线程同步和协作,是理解和掌握多...

    10、阻塞队列BlockingQueue实战及其原理分析.pdf

    ### 10、阻塞队列BlockingQueue 实战及其原理分析 #### 一、阻塞队列概述 阻塞队列(BlockingQueue)是Java语言中`java.util.concurrent`包下提供的一种重要的线程安全队列。它继承自`Queue`接口,并在此基础上...

    10、阻塞队列BlockingQueue实战及其原理分析

    阻塞队列BlockingQueue是Java并发编程中一个重要的数据结构,它是线程安全的队列,主要用于生产者消费者模型中的数据交换。在Java的`java.util.concurrent`包中,提供了多种实现阻塞队列的类,如`ArrayBlockingQueue...

    阻塞队列BlockingQueue的使用

    在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文简要介绍下BlockingQueue...

    Java-concurrent-collections-concurrenthashmap-blockingqueue.pdf

    BlockingQueue 是 Java 并发集合框架中的一种阻塞队列实现,提供了高效的并发操作和线程安全机制。它可以实现生产者-消费者模式,用于在多线程环境中实现高效的数据生产和消费。 BlockingQueue 的特点包括: * ...

    java 中 阻塞队列BlockingQueue详解及实例

    Java中的阻塞队列BlockingQueue是一种并发编程中常用的工具,它实现了线程间的同步和通信。阻塞队列的核心特性在于当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;当队列满时,尝试添加元素的...

    线程----BlockingQueue

    `BlockingQueue`是一种特殊类型的队列,主要用于多线程环境中的任务管理。它具有以下特性:当队列为空时,从队列中获取元素的操作会被阻塞;同样地,当队列满时,向队列中添加元素的操作也会被阻塞。这种特性使得`...

    详解Java阻塞队列(BlockingQueue)的实现原理

    SynchronousQueue 是一个特殊的队列,它的内部同时只能够容纳单个元素。如果该队列已有一元素的话,试图向队列中插入一个新元素的线程将会阻塞,直到另一个线程将该元素从队列中抽走。同样,如果该队列为空,试图向...

    6.6 阻塞队列BlockingQueue 实战及其原 理分析一副本.mp4

    6.6 阻塞队列BlockingQueue 实战及其原 理分析一副本.mp4

    6.7 阻塞队列BlockingQueue 实战及其原 理分析二副本.mp4

    6.7 阻塞队列BlockingQueue 实战及其原 理分析二副本.mp4

    6.6 阻塞队列BlockingQueue 实战及其原 理分析一副本副本.mp4

    6.6 阻塞队列BlockingQueue 实战及其原 理分析一副本副本.mp4

    Java中的BlockingQueue:深入理解与实践应用

    SynchronousQueue是一种特殊的阻塞队列,它没有容量,元素必须直接从生产者传递到消费者,适用于一对一的线程通信场景。DelayQueue则用于存放实现了Delayed接口的元素,该队列只允许在元素的延时期满后才能从队列中...

    6.7 阻塞队列BlockingQueue 实战及其原 理分析二副本副本.mp4

    6.7 阻塞队列BlockingQueue 实战及其原 理分析二副本副本.mp4

    6.6 阻塞队列BlockingQueue 实战及其原 理分析一副本副本副本.mp4

    6.6 阻塞队列BlockingQueue 实战及其原 理分析一副本副本副本.mp4

Global site tag (gtag.js) - Google Analytics