1. 程式人生 > 程式設計 >java阻塞佇列實現原理及例項解析

java阻塞佇列實現原理及例項解析

這篇文章主要介紹了java阻塞佇列實現原理及例項解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

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

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

從5.0開始,JDK在Java.util.concurrent包裡提供了阻塞佇列的官方實現。儘管JDK中已經包含了阻塞佇列的官方實現。

阻塞佇列的實現

阻塞佇列的實現類似於帶上限的Semaphore的實現。

廢話不多說:

package com.huojg.test;
import java.util.LinkedList;
import java.util.List;
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中,對於Lock和Condition可以理解為對傳統的synchronized和wait/notify機制的替代。

wait/notify有個限制,呼叫wait/notify的執行緒必須持有物件的鎖。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。