`

特殊的队列: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(阻塞队列)详解

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

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

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

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

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

    BlockingQueue的使用

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

    spring-blockingqueue:用Spring Boot阻止队列

    当我们谈论"Spring BlockingQueue"时,我们实际上是在讨论如何在Spring Boot应用中使用Java并发库中的BlockingQueue接口。 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

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

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

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

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

    基于java中BlockingQueue的使用介绍

    **基于Java中的BlockingQueue使用介绍** Java的并发编程框架提供了多种高级并发工具,其中BlockingQueue是一种非常实用的数据结构,它实现了生产者-消费者模式。在多线程环境下,BlockingQueue可以高效地处理线程间...

Global site tag (gtag.js) - Google Analytics