`
iluoxuan
  • 浏览: 582110 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

BlockingQueue的详细介绍和实例

 
阅读更多

本文转载:http://blog.csdn.net/zlb824/article/details/7091814

本例介绍一个特殊的队列: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。

 

 

[java] view plaincopy
  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.   
  6. /** *//** 
  7. * BlockingQueue是一种特殊的Queue,若BlockingQueue是空的, 
  8. * 从BlockingQueue取东西的操作将会被阻断进入等待状态直到BlocingkQueue进了新货才会被唤醒。 
  9. * 同样,如果BlockingQueue是满的任何试图往里存东西的操作也会被阻断进入等待状态, 
  10. * 直到BlockingQueue里有新的空间才会被唤醒继续操作。 
  11. * BlockingQueue提供的方法主要有: 
  12. * add(anObject): 把anObject加到BlockingQueue里,如果BlockingQueue可以容纳返回true,否则抛出IllegalStateException异常。  
  13. * offer(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容纳返回true,否则返回false。  
  14. * put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue没有空间,调用此方法的线程被阻断直到BlockingQueue里有新的空间再继续。  
  15. * poll(time):取出BlockingQueue里排在首位的对象,若不能立即取出可等time参数规定的时间。取不到时返回null。  
  16. * take():取出BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的对象被加入为止。 
  17.  
  18. * 根据不同的需要BlockingQueue有4种具体实现: 
  19. * (1)ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小。其所含的对象是以FIFO(先入先出)顺序排序的。  
  20. * (2)LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制, 
  21. * 若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO(先入先出)顺序排序的。 
  22. * LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样, 
  23. * 导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue。  
  24. * (3)PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。  
  25. * (4)SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的。 
  26.  
  27. * 下面是用BlockingQueue来实现Producer和Consumer的例子 
  28. */  
  29. public class BlockingQueueTest {  
  30.   
  31.     /** *//** 
  32.      * 定义装苹果的篮子 
  33.      */  
  34.     public static class Basket{  
  35.         // 篮子,能够容纳3个苹果  
  36.         BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);  
  37.           
  38.         // 生产苹果,放入篮子  
  39.         public void produce() throws InterruptedException{  
  40.             // put方法放入一个苹果,若basket满了,等到basket有位置  
  41.             basket.put("An apple");  
  42.         }  
  43.         // 消费苹果,从篮子中取走  
  44.         public String consume() throws InterruptedException{  
  45.             // get方法取出一个苹果,若basket为空,等到basket有苹果为止  
  46.             return basket.take();  
  47.         }  
  48.     }  
  49.     // 测试方法  
  50.     public static void testBasket() {  
  51.         // 建立一个装苹果的篮子  
  52.         final Basket basket = new Basket();  
  53.         // 定义苹果生产者  
  54.         class Producer implements Runnable {  
  55.             public void run() {  
  56.                 try {  
  57.                     while (true) {  
  58.                         // 生产苹果  
  59.                         System.out.println("生产者准备生产苹果:"   
  60.                                 + System.currentTimeMillis());  
  61.                         basket.produce();  
  62.                         System.out.println("生产者生产苹果完毕:"   
  63.                                 + System.currentTimeMillis());  
  64.                         // 休眠300ms  
  65.                         Thread.sleep(300);  
  66.                     }  
  67.                 } catch (InterruptedException ex) {  
  68.                 }  
  69.             }  
  70.         }  
  71.         // 定义苹果消费者  
  72.         class Consumer implements Runnable {  
  73.             public void run() {  
  74.                 try {  
  75.                     while (true) {  
  76.                         // 消费苹果  
  77.                         System.out.println("消费者准备消费苹果:"   
  78.                                 + System.currentTimeMillis());  
  79.                         basket.consume();  
  80.                         System.out.println("消费者消费苹果完毕:"   
  81.                                 + System.currentTimeMillis());  
  82.                         // 休眠1000ms  
  83.                         Thread.sleep(1000);  
  84.                     }  
  85.                 } catch (InterruptedException ex) {  
  86.                 }  
  87.             }  
  88.         }  
  89.           
  90.         ExecutorService service = Executors.newCachedThreadPool();  
  91.         Producer producer = new Producer();  
  92.         Consumer consumer = new Consumer();  
  93.         service.submit(producer);  
  94.         service.submit(consumer);  
  95.         // 程序运行5s后,所有任务停止  
  96.         try {  
  97.             Thread.sleep(5000);  
  98.         } catch (InterruptedException e) {  
  99.         }  
  100.         service.shutdownNow();  
  101.     }  
  102.   
  103.     public static void main(String[] args) {  
  104.         BlockingQueueTest.testBasket();  
  105.     }  
  106. }  
分享到:
评论

相关推荐

    线程----BlockingQueue

    ### 线程与BlockingQueue知识点详解 #### 1. BlockingQueue简介 `BlockingQueue`是一种特殊...通过上述实例,我们可以看到`BlockingQueue`如何有效地管理生产者与消费者之间的数据流,确保数据的一致性和线程安全性。

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

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

    BlockingQueue的使用

    1. 如何创建不同类型的BlockingQueue实例。 2. 生产者线程和消费者线程如何使用`put()`和`take()`方法交互。 3. 如何处理队列满或空的异常情况,例如使用`offer()`和`poll()`方法的超时版本。 4. 如何控制并发线程...

    多线程详细讲解与实例

    本文将深入探讨多线程的概念、工作原理、优缺点,并结合实例进行详细讲解。 首先,多线程是指在一个进程中可以同时运行多个线程。线程是操作系统分配CPU时间的基本单元,相比单线程,多线程能够更好地利用系统资源...

    并发容器——BlockingQueue相关类

    这个文件可能包含了如何创建`BlockingQueue`实例,以及如何在生产者和消费者线程之间正确使用它的代码片段。分析这个测试文件可以帮助我们更好地理解和应用`BlockingQueue`。实际操作中,我们可以通过监控和调优这些...

    java中线程队列BlockingQueue的用法

    在Java编程中,`BlockingQueue`(阻塞队列)是一种重要的并发工具,它结合了队列的数据结构和线程同步机制。`BlockingQueue`接口位于`java.util.concurrent`包中,提供了线程安全的数据结构,可以用于实现生产者-...

    Java并发编程--BlockingQueue.docx

    示例代码展示了如何创建生产者和消费者线程,它们共享同一个 BlockingQueue 实例,通过 `put()` 和 `take()` 方法实现数据的传递。 在 ArrayBlockingQueue 和 LinkedBlockingQueue 的实现中,当队列满时,生产者...

    java 多线程并发实例

    Java的BlockingQueue接口(如ArrayBlockingQueue)非常适合实现这一模型,它提供了线程安全的数据插入和移除操作。 在实例中提到的"全部开始 全部停止 单个停止"可能涉及到线程的启动和控制,这可以通过控制线程的...

    spring-blockingqueue:用Spring Boot阻止队列

    在Spring Boot中,我们可以通过配置bean来创建和管理BlockingQueue实例。通常,我们会选择实现BlockingQueue的类,如ArrayBlockingQueue、LinkedBlockingQueue或PriorityBlockingQueue,根据实际需求选择合适的实现...

    Java 实例 - 生产者消费者问题源代码+详细指导教程.zip

    本实例提供了源代码和详细指导教程,帮助开发者深入理解这一概念。 生产者消费者问题通常使用Java中的`java.util.concurrent`包来解决,特别是`BlockingQueue`接口。在这个例子中,`BlockingQueue`作为共享的缓冲区...

    2011.08.30(2)——— java BlockingQueue ExecutorService

    在TestBlockingQueueAndExecutorService这个测试用例中,作者可能演示了如何创建一个ExecutorService实例,然后将Runnable或Callable任务提交给它执行,同时使用BlockingQueue作为线程间的通信工具。通过这种方式,...

    java线程并发blockingqueue类使用示例

    总的来说,`BlockingQueue`是Java并发编程中不可或缺的一部分,它提供了一种优雅的同步机制,使得生产者和消费者可以协同工作,避免了显式的锁和条件变量的使用,简化了多线程编程。在设计高性能、低延迟的系统时,`...

    Java多线程编程实例

    Java提供了BlockingQueue接口,实现了线程安全的队列,可以高效地在生产者和消费者之间传递数据。此外,还可以利用并发工具类如Semaphore(信号量)来控制对有限资源的访问,或者使用CountDownLatch来协调多个线程的...

    《多线程开发实例代码》

    本压缩包提供了两个基本的多线程开发实例,涵盖了通过继承`Thread`类和实现`Runnable`接口来创建线程的方法。这两种方法都是Java中实现并发的基本途径,各有优缺点。 首先,我们来看`ThreadDemo`。这个例子展示了...

    spring MVC 初始启动blocking queue

    在你的博客中,你可能详细讲解了如何在Spring MVC初始化阶段配置并使用`BlockingQueue`。这可能涉及到以下步骤: 1. 定义一个`BlockingQueue`的bean,例如使用`ArrayBlockingQueue`,并设置其容量以满足你的应用...

    java经典实例 代码简短详细

    - **解决思路**: 使用 Java 的 `wait()` 和 `notify()` 方法,或者利用 `BlockingQueue` 类等来实现线程间的同步。 ### 四、序列化的编程实现 #### 1. 序列化概念 - **序列化**: 将对象的状态转换为可以存储或传输...

    简单多线程实例简单多线程实例简单多线程实例

    - **线程通信**:线程间可以通过`wait()`, `notify()`, `notifyAll()`进行同步,或者使用`BlockingQueue`等并发容器来交换数据。 - **线程优先级**:Java中的线程优先级从1(`Thread.MIN_PRIORITY`)到10(`Thread....

    java线程实例 各种小Demo

    Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而...在"线程池.rar"和"线程实例"这两个文件中,你可以找到关于这些概念的具体示例代码,通过学习和实践,可以深入理解Java线程的运用和管理。

    Java 实例 - 查看线程优先级源代码+详细指导教程.zip

    这个压缩包“Java 实例 - 查看线程优先级源代码+详细指导教程.zip”包含了一个关于如何查看和理解Java线程优先级的实例源代码和教学材料,对于深入学习Java多线程编程非常有帮助。 在Java中,线程的优先级是由`...

    线程学习实例和笔记

    5. **线程通信**:线程间的通信可以通过wait(), notify()和notifyAll()方法,或者使用高级API如Semaphore、BlockingQueue等实现。 6. **线程池**:线程池可以有效地管理和控制线程,避免频繁创建和销毁线程带来的...

Global site tag (gtag.js) - Google Analytics