Java線程池隊(duì)列PriorityBlockingQueue和SynchronousQueue詳解
正文
public enum QueueTypeEnum {
ARRAY_BLOCKING_QUEUE(1, "ArrayBlockingQueue"),
LINKED_BLOCKING_QUEUE(2, "LinkedBlockingQueue"),
DELAY_QUEUE(3, "DelayQueue"),
PRIORITY_BLOCKING_QUEUE(4, "PriorityBlockingQueue"),
SYNCHRONOUS_QUEUE(5, "SynchronousQueue"),
LINKED_TRANSFER_QUEUE(6, "LinkedTransferQueue"),
LINKED_BLOCKING_DEQUE(7, "LinkedBlockingDeque"),
VARIABLE_LINKED_BLOCKING_QUEUE(8, "VariableLinkedBlockingQueue"),
MEMORY_SAFE_LINKED_BLOCKING_QUEUE(9, "MemorySafeLinkedBlockingQueue");
}
PriorityBlockingQueue阻塞優(yōu)先隊(duì)列
一個(gè)支持優(yōu)先級排序的無界阻塞隊(duì)列;對元素沒有要求,可以實(shí)現(xiàn)Comparable接口也可以提供 Comparator來對隊(duì)列中的元素進(jìn)行比較。通過構(gòu)造函數(shù)傳入的對象來判斷,傳入的對象必須實(shí)現(xiàn)comparable接口,并重寫compareTo方法??梢园凑?strong>自然排序或自定義排序的順序在隊(duì)列中對元素進(jìn)行排序。
例如新建對象Person:
public class Person implements Comparable<Person>{
private int id;
@Override
public int compareTo(Person person) {
return this.id > person.getId() ? 1 : ( this.id < person.getId() ? -1 :0);
}
}
每次添加一個(gè)元素,PriorityBlockingQueue中的person都會(huì)執(zhí)行compareTo方法進(jìn)行排序,但是只是把第一個(gè)元素排在首位,其他元素按照隊(duì)列的一系列復(fù)雜算法排序。這就保障了每次獲取到的元素都是經(jīng)過排序的第一個(gè)元素。
SynchronousQueue
SynchronousQueue是一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列,是BlockingQueue的一種,SynchronousQueue線程安全的。SynchronousQueue和其他的BlockingQueue不同的是SynchronousQueue的capacity是0。即SynchronousQueue不存儲(chǔ)任何元素。消費(fèi)者線程調(diào)用 take() 方法的時(shí)候就會(huì)發(fā)生阻塞,直到有一個(gè)生產(chǎn)者線程生產(chǎn)了一個(gè)元素,消費(fèi)者線程就可以拿到這個(gè)元素并返回;生產(chǎn)者線程調(diào)用 put() 方法的時(shí)候也會(huì)發(fā)生阻塞,直到有一個(gè)消費(fèi)者線程消費(fèi)了一個(gè)元素,生產(chǎn)者才會(huì)返回。
SynchronousQueue內(nèi)部并沒有數(shù)據(jù)緩存空間,你不能調(diào)用peek()方法來看隊(duì)列中是否有數(shù)據(jù)元素,因?yàn)閿?shù)據(jù)元素只有當(dāng)你試著取走的時(shí)候才可能存在,不取走而只想偷 窺一下是不行的,當(dāng)然遍歷這個(gè)隊(duì)列的操作也是不允許的。
隊(duì)列頭元素是第一個(gè)排隊(duì)要插入數(shù)據(jù)的線程,而不是要交換的數(shù)據(jù)。數(shù)據(jù)是在配對的生產(chǎn)者和消費(fèi)者線程之間直接傳遞的,并不會(huì)將數(shù)據(jù)緩沖到隊(duì)列中??梢赃@樣來理解:生產(chǎn)者和消費(fèi)者互相等待對方,握手,然后一起離開。
SynchronousQueue的一個(gè)使用場景是在線程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue,這個(gè)線程池根據(jù)需要(新任務(wù)到來時(shí))創(chuàng)建新的線程,如果有空閑線程則會(huì)重復(fù)使用,線程空閑了60秒后會(huì)被回收?!?/p>
以上就是Java線程池隊(duì)列PriorityBlockingQueue和SynchronousQueue詳解的詳細(xì)內(nèi)容,更多關(guān)于Java線程池隊(duì)列的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中靜態(tài)類型檢查是如何進(jìn)行的實(shí)例思路詳解
這篇文章主要介紹了Java中靜態(tài)類型檢查是如何進(jìn)行的實(shí)例思路詳解的相關(guān)資料,需要的朋友可以參考下2016-05-05
Java中的HashSet詳解和使用示例_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
HashSet 是一個(gè)沒有重復(fù)元素的集合。接下來通過實(shí)例代碼給大家介紹java中的hashset相關(guān)知識,感興趣的朋友一起看看吧2017-05-05
Java基礎(chǔ)學(xué)習(xí)之IO流應(yīng)用案例詳解
這篇文章主要為大家詳細(xì)介紹了Java?IO流的三個(gè)應(yīng)用案例:點(diǎn)名器、集合到文件和文件到集合,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09
java實(shí)現(xiàn)后臺(tái)數(shù)據(jù)顯示在前端
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)后臺(tái)數(shù)據(jù)顯示在前端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
Java String字符串和Unicode字符相互轉(zhuǎn)換代碼
這篇文章主要介紹了Java String字符串和Unicode字符相互轉(zhuǎn)換代碼,需要的朋友可以參考下2014-10-10
在java中實(shí)現(xiàn)C#語法里的按引用傳遞參數(shù)的方法
下面小編就為大家?guī)硪黄趈ava中實(shí)現(xiàn)C#語法里的按引用傳遞參數(shù)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
解決springboot自定義配置Boolean屬性不能生效的問題
這篇文章主要介紹了解決springboot自定義配置Boolean屬性不能生效的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Java驗(yàn)證碼功能的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了Java驗(yàn)證碼功能的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
java多態(tài)實(shí)現(xiàn)電子寵物系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java多態(tài)實(shí)現(xiàn)電子寵物系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

