欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的堵塞隊(duì)列BlockingQueue詳解

 更新時(shí)間:2023年12月27日 09:33:27   作者:緣來如此09  
這篇文章主要介紹了Java的堵塞隊(duì)列BlockingQueue詳解,阻塞隊(duì)列常用于生產(chǎn)者和消費(fèi)者的場景,生產(chǎn)者是向隊(duì)列里添加元素的線程,消費(fèi)者是從隊(duì)列里取元素的線程,需要的朋友可以參考下

一、簡介

阻塞隊(duì)列(BlockingQueue)是一個(gè)支持兩個(gè)附加操作的隊(duì)列。

這兩個(gè)附加的操作支持阻塞的插入和移除方法。

1)支持阻塞的插入方法:意思是當(dāng)隊(duì)列滿時(shí),隊(duì)列會(huì)阻塞插入元素的線程,直到隊(duì)列不滿。

2)支持阻塞的移除方法:意思是在隊(duì)列為空時(shí),獲取元素的線程會(huì)等待隊(duì)列變?yōu)榉强铡?/p>

阻塞隊(duì)列常用于生產(chǎn)者和消費(fèi)者的場景,生產(chǎn)者是向隊(duì)列里添加元素的線程,消費(fèi)者是從隊(duì)列里取元素的線程。

阻塞隊(duì)列就是生產(chǎn)者用來存放元素、消費(fèi)者用來獲取元素的容器。

二、BlockingQueue接口提供的方法

1.異常:

是指當(dāng)阻塞隊(duì)列滿時(shí)候,再往隊(duì)列里插入元素,會(huì)拋出IllegalStateException("Queuefull")異常。當(dāng)隊(duì)列為空時(shí),從隊(duì)列里獲取元素時(shí)會(huì)拋出NoSuchElementException異常。

2.返回特殊值:

插入方法會(huì)返回是否成功,成功則返回true。移除方法,則是從隊(duì)列里拿出一個(gè)元素,如果沒有則返回null

3.一直阻塞:

當(dāng)阻塞隊(duì)列滿時(shí),如果生產(chǎn)者線程往隊(duì)列里put元素,隊(duì)列會(huì)一直阻塞生產(chǎn)者線程,直到拿到數(shù)據(jù),或者響應(yīng)中斷退出。當(dāng)隊(duì)列空時(shí),消費(fèi)者線程試圖從隊(duì)列里take元素,隊(duì)列也會(huì)阻塞消費(fèi)者線程,直到隊(duì)列可用。

4.超時(shí)退出:

當(dāng)阻塞隊(duì)列滿時(shí),隊(duì)列會(huì)阻塞生產(chǎn)者線程一段時(shí)間,如果超過一定的時(shí)間,生產(chǎn)者線程就會(huì)退出。

BlockingQueue接口源碼

public interface BlockingQueue<E> extends Queue<E> {
    //將給定元素設(shè)置到隊(duì)列中,如果設(shè)置成功返回true, 否則拋出異常。如果是往限定了長度的隊(duì)列中設(shè)置值,推薦使用offer()方法。
    boolean add(E e);
    //將給定的元素設(shè)置到隊(duì)列中,如果設(shè)置成功返回true, 否則返回false. e的值不能為空,否則拋出空指針異常。
    boolean offer(E e);
    //將元素設(shè)置到隊(duì)列中,如果隊(duì)列中沒有多余的空間,該方法會(huì)一直阻塞,直到隊(duì)列中有多余的空間。
    void put(E e) throws InterruptedException;
    //將給定元素在給定的時(shí)間內(nèi)設(shè)置到隊(duì)列中,如果設(shè)置成功返回true, 否則返回false.
    boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException;
    //從隊(duì)列中獲取值,如果隊(duì)列中沒有值,線程會(huì)一直阻塞,直到隊(duì)列中有值,并且該方法取得了該值。
    E take() throws InterruptedException;
    //在給定的時(shí)間里,從隊(duì)列中獲取值,如果沒有取到會(huì)拋出異常。
    E poll(long timeout, TimeUnit unit)
        throws InterruptedException;
    //獲取隊(duì)列中剩余的空間。
    int remainingCapacity();
    //從隊(duì)列中移除指定的值。
    boolean remove(Object o);
    //判斷隊(duì)列中是否擁有該值。
    public boolean contains(Object o);
    //將隊(duì)列中值,全部移除,并發(fā)設(shè)置到給定的集合中。
    int drainTo(Collection<? super E> c);
    //指定最多數(shù)量限制將隊(duì)列中值,全部移除,并發(fā)設(shè)置到給定的集合中。
    int drainTo(Collection<? super E> c, int maxElements);
}

三、Java里的阻塞隊(duì)列

JDK提供了7個(gè)阻塞隊(duì)列,如下。

1.ArrayBlockingQueue是一個(gè)用數(shù)組實(shí)現(xiàn)的有界阻塞隊(duì)列,此隊(duì)列按照先進(jìn)先出(FIFO)的原則對(duì)元素進(jìn)行排序。支持公平鎖和非公平鎖。

【注:每一個(gè)線程在獲取鎖的時(shí)候可能都會(huì)排隊(duì)等待,如果在等待時(shí)間上,先獲取鎖的線程的請求一定先被滿足,那么這個(gè)鎖就是公平的。反之,這個(gè)鎖就是不公平的。公平的獲取鎖,也就是當(dāng)前等待時(shí)間最長的線程先獲取鎖】

2.LinkedBlockingQueue

LinkedBlockingQueue:一個(gè)由鏈表結(jié)構(gòu)組成的有界隊(duì)列,此隊(duì)列的長度為Integer.MAX_VALUE。此隊(duì)列按照先進(jìn)先出的順序進(jìn)行排序

3.PriorityBlockingQueue

一個(gè)支持線程優(yōu)先級(jí)排序的無界隊(duì)列,默認(rèn)自然序進(jìn)行排序,也可以自定義實(shí)現(xiàn)compareTo()方法來指定元素排序規(guī)則,不能保證同優(yōu)先級(jí)元素的順序。

4.DelayQueue

一個(gè)實(shí)現(xiàn)PriorityBlockingQueue實(shí)現(xiàn)延遲獲取的無界隊(duì)列,在創(chuàng)建元素時(shí),可以指定多久才能從隊(duì)列中獲取當(dāng)前元素。只有延時(shí)期滿后才能從隊(duì)列中獲取元素。(DelayQueue可以運(yùn)用在以下應(yīng)用場景:

1.緩存系統(tǒng)的設(shè)計(jì):可以用DelayQueue保存緩存元素的有效期,使用一個(gè)線程循環(huán)查詢DelayQueue,一旦能從DelayQueue中獲取元素時(shí),表示緩存有效期到了。

2.定時(shí)任務(wù)調(diào)度。使用DelayQueue保存當(dāng)天將會(huì)執(zhí)行的任務(wù)和執(zhí)行時(shí)間,一旦從DelayQueue中獲取到任務(wù)就開始執(zhí)行,從比如TimerQueue就是使用DelayQueue實(shí)現(xiàn)的。)

5.SynchronousQueue

一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列,每一個(gè)put操作必須等待take操作,否則不能添加元素。支持公平鎖和非公平鎖。SynchronousQueue的一個(gè)使用場景是在線程池里。Executors.newCachedThreadPool()就使用了SynchronousQueue,這個(gè)線程池根據(jù)需要(新任務(wù)到來時(shí))創(chuàng)建新的線程,如果有空閑線程則會(huì)重復(fù)使用,線程空閑了60秒后會(huì)被回收。

6.LinkedTransferQueue

 一個(gè)由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列,相當(dāng)于其它隊(duì)列,LinkedTransferQueue隊(duì)列多了transfer和tryTransfer方法。

7.LinkedBlockingDeque

 一個(gè)由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列。隊(duì)列頭部和尾部都可以添加和移除元素,多線程并發(fā)時(shí),可以將鎖的競爭最多降到一半。

到此這篇關(guān)于Java的堵塞隊(duì)列BlockingQueue詳解的文章就介紹到這了,更多相關(guān)BlockingQueue堵塞隊(duì)列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot Redis?哨兵模式的實(shí)現(xiàn)示例

    Springboot Redis?哨兵模式的實(shí)現(xiàn)示例

    本文主要介紹了Springboot Redis?哨兵模式的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java序列化框架Kryo高效轉(zhuǎn)換對(duì)象為字節(jié)流面試精講

    Java序列化框架Kryo高效轉(zhuǎn)換對(duì)象為字節(jié)流面試精講

    這篇文章主要為大家介紹了Java序列化框架Kryo高效轉(zhuǎn)換對(duì)象為字節(jié)流面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解

    Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解

    這篇文章主要介紹了Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解,本文主要是介紹幾種零拷貝的實(shí)現(xiàn)示例,以及與最傳統(tǒng)的做一個(gè)對(duì)比,看看在效率上到底有多大的提升,需要的朋友可以參考下
    2023-12-12
  • Springboot導(dǎo)入本地jar后 打包依賴無法加入的解決方案

    Springboot導(dǎo)入本地jar后 打包依賴無法加入的解決方案

    這篇文章主要介紹了Springboot導(dǎo)入本地jar后 打包依賴無法加入的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • springboot實(shí)現(xiàn)上傳并解析Excel過程解析

    springboot實(shí)現(xiàn)上傳并解析Excel過程解析

    這篇文章主要介紹了springboot實(shí)現(xiàn)上傳并解析Excel過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • maven 打包時(shí)間戳問題

    maven 打包時(shí)間戳問題

    這篇文章主要介紹了maven 打包時(shí)間戳問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Springboot實(shí)現(xiàn)XSS漏洞過濾的示例代碼

    Springboot實(shí)現(xiàn)XSS漏洞過濾的示例代碼

    這篇文章主要介紹了Springboot實(shí)現(xiàn)XSS漏洞過濾的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java中四種遍歷List的方法總結(jié)(推薦)

    Java中四種遍歷List的方法總結(jié)(推薦)

    下面小編就為大家?guī)硪黄狫ava中四種遍歷List的方法總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • SpringCache使用案例詳解

    SpringCache使用案例詳解

    這篇文章主要介紹了SpringCache使用案例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • Spring Boot2配置Swagger2生成API接口文檔詳情

    Spring Boot2配置Swagger2生成API接口文檔詳情

    這篇文章主要介紹了Spring Boot2配置Swagger2生成API接口文檔詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09

最新評(píng)論