BlockingQueue阻塞佇列

2022-02-14 07:11:29 字數 3623 閱讀 7403

當阻塞佇列是空時,從佇列中獲取元素的操作會被阻塞,直到其他的執行緒往空的佇列中插入新的元素。

當阻塞佇列是滿時,從佇列中新增元素的操作會被阻塞,直到其他執行緒從佇列中移除乙個或多個元素使得佇列變得空閒器來後繼續新增。

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

在多執行緒領域:所謂阻塞,在某些情況下會掛起執行緒(阻塞),一旦條件滿足,被掛起的執行緒又會被自動喚醒。

blockingqueue所有的實現:

arrayblockingqueue:由陣列結構組成的有界阻塞佇列

linkedblockingqueue:由鍊錶組成的有界阻塞佇列(大小預設integer.max_value)

synchronousqueue:不儲存元素的阻塞佇列,也即單個元素的佇列

priorityblockingqueue:支援優先順序排序的無界阻塞佇列

delayqueue:使用優先順序佇列實現的延遲無界阻塞佇列

linkedtransferqueue:由鍊錶結構組成的無界阻塞佇列

linkedblockingdeque:由鍊錶結構組成的雙向阻塞佇列

add(e):返回true,新增失敗時丟擲異常

offer(e):返回true/false,方法特別之處用於新增失敗時只返回false

put(e):void,當阻塞佇列滿時,生產者如果往佇列裡put元素,則佇列會一直阻塞生產者執行緒,直到佇列可用或者響應中斷退出

offer(e,time,unit):返回true/false,當阻塞佇列滿時,生產者如果往佇列裡面插入元素,佇列會阻塞生產者執行緒一段時間,如果超過了指定時間,生產者執行緒會退出,並返回false

remove():返回true,移除失敗時丟擲異常

poll():返回移除元素/null,移除失敗時返回null

take():返回移除元素,當阻塞隊列為空時,消費者執行緒如果從佇列裡面移除元素,則佇列會一直阻塞消費者執行緒,直到佇列不為空

poll(time,unit):返回移除元素/null,當阻塞佇列空時,消費者如果從佇列裡面刪除元素,則佇列會一直阻塞消費者執行緒,如果超過了指定時間,消費者執行緒會退出,並返回null

element():返回頭部的元素,如果隊列為空,則丟擲異常,否則返回頭部元素

peek():返回移除元素/null,如果隊列為空,返回特殊值null,否則返回頭部的元素。

drainto(collection super e> c) 從該佇列中刪除所有可用的元素,並將它們新增到給定的集合中。

drainto(collection super e> c, int maxelements) 最多從該佇列中刪除給定數量的可用元素,並將它們新增到給定的集合中。

remainingcapacity() 返回佇列剩餘容量

blockingqueuequeue = new synchronousqueue<>();

new thread(()-> catch (interruptedexception e)

},"t1").start();

new thread(()-> catch (interruptedexception e)

},"t2").start();

建立執行緒池時,引數runnabletaskqueue(任務佇列),用於儲存等待執行的任務的阻塞佇列可以選擇synchronousqueue。靜態工廠方法executors.newcachedthreadpool()使用了這個佇列。

乙個初始值為零的變數,兩個執行緒對其交替操作,乙個加1乙個減1

吞吐量通常要高於arrayblockingqueue。建立執行緒池時,引數runnabletaskqueue(任務佇列),用於儲存等待執行的任務的阻塞佇列可以選擇linkedblockingqueue。靜態工廠方法executors.newfixedthreadpool()使用了這個佇列。

linkedblockingdeque可以用在「工作竊取「模式中。

工作竊取演算法:某個執行緒比較空閒,從其他執行緒的工作佇列中的隊尾竊取任務來幫忙執行。

delayqueue = delayed + blockingqueue。佇列中的元素必須實現delayed介面。

public class delayqueueextends abstractqueueimplements blockingqueue

number++;

system.out.println(thread.currentthread().getname()+" number : "+ number);

condition.signalall();

}catch (exception e)finally

}public void decrement()

number--;

system.out.println(thread.currentthread().getname()+" number : "+ number);

condition.signalall();

}catch (exception e)finally }}

測試方法:

資源類

class myresource

public void myprod() throws exception

system.out.println(thread.currentthread().getname()+"生產退出");

}public void myconsumer() throws exception

system.out.println(thread.currentthread().getname()+"消費退出");

}public void stop()

}

測試類:

阻塞佇列BlockingQueue

例介紹乙個特殊的佇列 blockingqueue,如果blockingqueue是空的,從blockingqueue取東西的操作將會被阻斷進入等待狀態,直到blockingqueue進了東西才會被喚醒,同樣,如果blockingqueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到b...

阻塞佇列BlockingQueue

1 佇列queue介紹 queue是jdk1.5引入的介面,繼承collection介面,是collection框架的新成員,是種先進先出 fifo 的佇列。public inte ce queueextends collection除了基本的collection操作外,佇列還提供其他的插入 提取和...

阻塞佇列 BlockingQueue

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