`

Java Blocking Queue

    博客分类:
  • Java
 
阅读更多
A blocking queue is a queue that blocks when you try to dequeue from it and the queue is empty, or if you try to enqueue items to it and the queue is already full. A thread trying to dequeue from an empty queue is blocked until some other thread inserts an item into the queue. A thread trying to enqueue an item in a full queue is blocked until some other thread makes space in the queue, either by dequeuing one or more items or clearing the queue completely.
Here is a diagram showing two threads cooperating via a blocking queue:
A BlockingQueue with one thread putting into it, and another thread taking from it.
A BlockingQueue with one thread putting into it, and another thread taking from it.
Java 5 comes with blocking queue implementations in the java.util.concurrent package. You can read about that class in my java.util.concurrent.BlockingQueue tutorial. Even if Java 5 comes with a blocking queue implementation, it can be useful to know the theory behind their implementation.

Blocking Queue Implementation

The implementation of a blocking queue looks similar to a Bounded Semaphore. Here is a simple implementation of a blocking queue:
public class BlockingQueue {

  private List queue = new LinkedList();
  private int  limit = 10;

  public BlockingQueue(int limit){
    this.limit = limit;
  }

  public synchronized void enqueue(Object item)
  throws InterruptedException  {
    while(this.queue.size() == this.limit) {
      wait();
    }
    if(this.queue.size() == 0) {
      notifyAll();
    }
    this.queue.add(item);
  }

  public synchronized Object dequeue()
  throws InterruptedException{
    while(this.queue.size() == 0){
      wait();
    }
    if(this.queue.size() == this.limit){
      notifyAll();
    }
    return this.queue.remove(0);
  }
}
 

Notice how notifyAll() is only called from enqueue() and dequeue() if the queue size is equal to the size bounds (0 or limit). If the queue size is not equal to either bound when enqueue() or dequeue() is called, there can be no threads waiting to either enqueue or dequeue items.

 
分享到:
评论

相关推荐

    Blocking Queue Usage

    在Java并发编程中,Blocking Queue(阻塞队列)是一个非常重要的工具类,它结合了线程同步与队列数据结构,有效地实现了生产者消费者模式。 Blocking Queue接口位于java.util.concurrent包下,它提供了一种在多线程...

    spring MVC 初始启动blocking queue

    总结来说,`spring MVC 初始启动concurrent blocking queue`涉及的是在Spring MVC应用启动时使用`@PostConstruct`注解初始化并使用`BlockingQueue`进行并发控制和任务处理。这一技术可以帮助提高系统性能,特别是在...

    基于java中BlockingQueue的使用介绍

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

    myeclipse2016

    myeclipse2016的汉语包和破解码,将压缩包中的文件全部替换到安装目录下

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    阻塞队列是Java中并发编程的一个重要组件,它属于Java.util.concurrent包中的一部分。阻塞队列的主要特点在于它支持两个额外的条件操作:当队列为空时,尝试从队列中取元素的操作会被阻塞,直到队列中出现新的元素;...

    C++写的跨平台BlockingQueue

    Java中的`BlockingQueue`是一个高效且常用的并发工具类,它提供了线程安全的数据结构,允许一个线程放入元素,而另一个线程取出元素,同时实现了阻塞功能,当队列为空时,取元素的线程会等待,直到有元素添加;...

    BlockingFQueue:基于磁盘持久存储的阻塞队列(Fast and Persistent Blocking Queue)

    在Java编程中,阻塞队列(Blocking Queue)是一种线程安全的数据结构,它在并发编程中扮演着重要角色,用于实现生产者消费者模型。通常,Java中的阻塞队列如`ArrayBlockingQueue`、`LinkedBlockingQueue`等都是内存...

    Java_0613_java_源码

    在Java编程语言中,"优先阻塞队列"(Priority Blocking Queue)是一个高效且功能强大的数据结构,它结合了队列的先进先出(FIFO)原则与堆的优先级特性。优先阻塞队列主要用在多线程环境中,为并发处理提供了便利。...

    DataStructure-Queue

    - **阻塞队列(Blocking Queue)**:在多线程环境下,当队列为空时,出队操作会阻塞直到有新的元素入队;反之,当队列满时,入队操作也会阻塞。 - **并发队列(Concurrent Queue)**:在多线程环境中,允许多个线程...

    Android代码-java-concurrency-patterns

    Java Concurrency Patterns and Features ...Blocking Queue Executors Fixed Thread Pool Cached Thread Pool Single Thread Pool Scheduled Thread Pool Atomics Futures FutureTask CompletableFuture Java M

    java线程文档大全

    14. **阻塞队列(Blocking Queue)和阻塞栈(Blocking Stack)**:Java并发包中的LinkedBlockingQueue和ArrayBlockingQueue是典型的阻塞队列实现,它们在插入和移除元素时能自动处理线程阻塞。Deque接口的实现如...

    Redisson 使用手册.pdf

    如映射(Map)、多值映射(Multimap)、集(Set)、有序集(SortedSet)、计分排序集(ScoredSortedSet)、字典排序集(LexSortedSet)、列表(List)、队列(Queue)、双端队列(Deque)、阻塞队列(Blocking Queue...

    Java高新技术4

    2. **Java集合框架**:Java集合框架包括接口(如`List`, `Set`, `Queue`)和实现(如`ArrayList`, `HashSet`, `LinkedList`, `HashMap`等)。它们提供了一种组织和操作对象的高效方式。例如,`ArrayList`是动态数组...

    Java语言程序设计进阶篇答案与代码

    2. **集合框架**:Java集合框架包括List、Set、Queue等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现。此外,还有并发安全的ConcurrentHashMap和CopyOnWriteArrayList等高级容器。 3. **异常处理**:...

    java入门到精通PPT

    5. **数组与集合框架**:介绍数组的使用及局限性,然后引出集合框架,包括List、Set、Queue和Map接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。 6. **异常处理**:学习如何捕获和处理程序运行时可能...

    java线程聊天室(阻塞队列实现)

    而阻塞队列(Blocking Queue)是Java并发包(java.util.concurrent)中的一种高效数据结构,常用于线程间的协作,它能够简化同步问题并提高系统性能。 阻塞队列是一种特殊的队列,当队列为空时,取出元素的操作将会...

    java教材(非常实用!)

    Java集合框架是存储和管理对象的工具,包括List、Set、Queue和Map接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。教材会讲解各种集合的区别、使用场景,以及它们的遍历、添加、删除等操作。 四、多...

    java阻塞队列实现原理及实例解析.docx

    Java 阻塞队列(Blocking Queue)是一种特殊类型的并发数据结构,它在多线程编程中扮演着重要的角色。阻塞队列的核心特性在于其在队列为空或满时能够自动阻塞线程,从而实现线程间的同步和通信。这种机制使得生产者...

    JAVA2 SDK 类库详解

    5. **集合框架**:JAVA2 SDK引入了强大的集合框架,包括List、Set、Queue、Map等接口以及ArrayList、HashSet、LinkedList、HashMap等实现类,使得数据操作更为便捷高效。 6. **I/O和NIO**:JAVA2 SDK提供了标准的I/...

Global site tag (gtag.js) - Google Analytics