1. 程式人生 > >Java阻塞佇列的實現

Java阻塞佇列的實現

阻塞佇列與普通佇列的區別在於,當佇列是空的時,從佇列中獲取元素的操作將會被阻塞,或者當佇列是滿時,往佇列裡新增元素的操作會被阻塞。試圖從空的阻塞佇列中獲取元素的執行緒將會被阻塞,直到其他的執行緒往空的佇列插入新的元素。同樣,試圖往已滿的阻塞佇列中新增新元素的執行緒同樣也會被阻塞,直到其他的執行緒使佇列重新變得空閒起來,如從佇列中移除一個或者多個元素,或者完全清空佇列,下圖展示瞭如何通過阻塞佇列來合作:

執行緒1往阻塞佇列中新增元素,而執行緒2從阻塞佇列中移除元素

從5.0開始,JDK在java.util.concurrent包裡提供了阻塞佇列的官方實現。儘管JDK中已經包含了阻塞佇列的官方實現,但是熟悉其背後的原理還是很有幫助的。

阻塞佇列的實現

阻塞佇列的實現類似於帶上限的Semaphore的實現。下面是阻塞佇列的一個簡單實現

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);
  }

}


必須注意到,在enqueue和dequeue方法內部,只有佇列的大小等於上限(limit)或者下限(0)時,才呼叫notifyAll方法。如果佇列的大小既不等於上限,也不等於下限,任何執行緒呼叫enqueue或者dequeue方法時,都不會阻塞,都能夠正常的往佇列中新增或者移除元素。

相關推薦

Java阻塞佇列實現生產者和消費者

生產者 import java.util.Random; import java.util.concurrent.BlockingQueue; //生產者 public class Producer implements Runnable{ private final Block

Java併發(十八):阻塞佇列BlockingQueue BlockingQueue(阻塞佇列)詳解 二叉堆(一)之 圖文解析 和 C語言的實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue(阻塞佇列)詳解

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者

Java阻塞佇列實現

阻塞佇列與普通佇列的區別在於,當佇列是空的時,從佇列中獲取元素的操作將會被阻塞,或者當佇列是滿時,往佇列裡新增元素的操作會被阻塞。試圖從空的阻塞佇列中獲取元素的執行緒將會被阻塞,直到其他的執行緒往空的佇列插入新的元素。同樣,試圖往已滿的阻塞佇列中新增新元素的執行緒同樣也會

java使用阻塞佇列實現生產者消費者模式

Java 5之前實現同步存取時,可以使用普通的一個集合,然後在使用執行緒的協作和執行緒同步可以實現生產者,消費者模式,主要的技術就是用好,wait ,notify,notifyAll,sychronized這些關鍵字。而在java 5之後,可以使用組阻塞佇列來實現,此方式

Java設計模式—生產者消費者模式(阻塞佇列實現

生產者消費者模式是併發、多執行緒程式設計中經典的設計模式,生產者和消費者通過分離的執行工作解耦,簡化了開發模式,生產者和消費者可以以不同的速度生產和消費資料。這篇文章我們來看看什麼是生產者消費者模式,這個問題也是多執行緒面試題中經常被提及的。如何使用阻塞佇列(Blocki

java多執行緒使用BlockingQueue阻塞佇列實現互斥同步通訊

package com.study; import java.util.concurrent.ArrayBlockingQu

Java併發包原始碼學習系列:阻塞佇列實現之ArrayBlockingQueue原始碼解析

[toc] 系列傳送門: - [Java併發包原始碼學習系列:AbstractQueuedSynchronizer](https://blog.csdn.net/Sky_QiaoBa_Sum/article/details/112254373) - [Java併發包原始碼學習系列:CLH同步佇列及同步資源

Java併發包原始碼學習系列:阻塞佇列實現之LinkedBlockingQueue原始碼解析

[toc] 系列傳送門: - [Java併發包原始碼學習系列:AbstractQueuedSynchronizer](https://blog.csdn.net/Sky_QiaoBa_Sum/article/details/112254373) - [Java併發包原始碼學習系列:CLH同步佇列及同步資源

Java併發包原始碼學習系列:阻塞佇列實現之PriorityBlockingQueue原始碼解析

[toc] 系列傳送門: - [Java併發包原始碼學習系列:AbstractQueuedSynchronizer](https://blog.csdn.net/Sky_QiaoBa_Sum/article/details/112254373) - [Java併發包原始碼學習系列:CLH同步佇列及同步資源

Java併發包原始碼學習系列:阻塞佇列實現之DelayQueue原始碼解析

[toc] 系列傳送門: - [Java併發包原始碼學習系列:AbstractQueuedSynchronizer](https://blog.csdn.net/Sky_QiaoBa_Sum/article/details/112254373) - [Java併發包原始碼學習系列:CLH同步佇列及同步資源

Java併發包原始碼學習系列:阻塞佇列實現之SynchronousQueue原始碼解析

[toc] 系列傳送門: - [Java併發包原始碼學習系列:AbstractQueuedSynchronizer](https://blog.csdn.net/Sky_QiaoBa_Sum/article/details/112254373) - [Java併發包原始碼學習系列:CLH同步佇列及同步資源

Java併發包原始碼學習系列:阻塞佇列實現之LinkedTransferQueue原始碼解析

[toc] 系列傳送門: Java併發包原始碼學習系列:AbstractQueuedSynchronizer Java併發包原始碼學習系列:CLH同步佇列及同步資源獲取與釋放 Java併發包原始碼學習系列:AQS共享式與獨佔式獲取與釋放資源的區別 Java併發包原始碼學習系列:ReentrantLock可重

Java阻塞佇列的學習筆記

## ArrayBlockingQueue的基本使用: 1、ArrayBlockingQueue是一個用陣列實現的有界阻塞佇列,內部按照先進先出的原則排序,take和put方法分別是新增和刪除元素的阻塞方法。 2、其內部是通過一個可重入鎖ReenterLock和Conditon條件佇列實現的,所

JAVA雙向佇列實現(連結串列)

佇列是很常見的一種資料儲存結構,今天,介紹下如何用連結串列實現雙向佇列。 首先定義節點介面如下: public interface Node<E> { //設定資料元素 public void setData(E o); //

java阻塞佇列

對訊息的處理有些麻煩,要保證各種確認。為了確保訊息的100%傳送成功,筆者在之前的基礎上做了一些改進。其中要用到多執行緒,用於重複傳送資訊。 所以查了很多關於執行緒安全的東西,也看到了阻塞佇列,發現這個模式很不錯,可惜我目前用不到。 關於這個的講解已經很多了,阻塞這個,就是當佇列中沒有資料的時候,執行緒讀

基於阻塞佇列實現的簡單生產者-消費者模式

生產者:生成資料放入到佇列中,供消費者消費; 消費者:從佇列中獲取資料,進行消費。 下面是一個簡單的生產者-消費者模式程式碼例項: 生產者執行緒每隔3秒生產一個隨機數並放入到阻塞佇列中,消費者執行緒不斷得去佇列中獲取元素進行消費。 1、生產者程式碼 /** * @Description: 生

基於java佇列實現

基於單鏈表的佇列實現 package org.util.ds; import java.util.Random; /** * 佇列 * @author Weibing Long * @since 2018.04.16 * @param <

JAVA阻塞佇列BlockingQueue

位於java.util.concurrent下,宣告:public interface BlockingQueue extends Queue 支援兩個附加操作的 Queue,這兩個操作是:獲取元素時等待佇列變為非空,以及儲存元素時等待空間變得可用。 BlockingQueue 方法以四種形式出現,對於不

Java併發指南11:解讀 Java 阻塞佇列 BlockingQueue

解讀 Java 併發佇列 BlockingQueue轉自:https://javadoop.com/post/java-concurrent-queue最近得空,想寫篇文章好好說說 java 執行緒池問題,我相信很多人都一知半解的,包括我自己在仔仔細細看原始碼之前,也有許多的

java 阻塞佇列

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService