最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Java中阻塞隊列BlockingQueue的詳解

 更新時間:2023年05月19日 11:19:02   作者:書啟秋楓  
這篇文章主要介紹了關(guān)于Java中阻塞隊列BlockingQueue的詳解,BlockingQueue是為了解決多線程中數(shù)據(jù)高效安全傳輸而提出的,從阻塞這個詞可以看出,在某些情況下對阻塞隊列的訪問可能會造成阻塞,需要的朋友可以參考下

棧與隊列概念

棧(Stack):先進(jìn)后出,后進(jìn)先出

隊列:先進(jìn)先出

1. 什么是BlockingQueue

在多線程領(lǐng)域:所謂阻塞,在某些情況下會掛起線程(即阻塞),一旦條件滿足,被掛起的線程又會自動被喚起。

BlockingQueue即阻塞隊列,是java.util.concurrent下的一個接口,因此不難理解,BlockingQueue是為了解決多線程中數(shù)據(jù)高效安全傳輸而提出的。從阻塞這個詞可以看出,在某些情況下對阻塞隊列的訪問可能會造成阻塞。被阻塞的情況主要有如下兩種:

  1. 當(dāng)隊列滿了的時候進(jìn)行入隊列操作
  2. 當(dāng)隊列空了的時候進(jìn)行出隊列操作

因此,當(dāng)一個線程試圖對一個已經(jīng)滿了的隊列進(jìn)行入隊列操作時,它將會被阻塞,除非有另一個線程做了出隊列操作;同樣,當(dāng)一個線程試圖對一個空隊列進(jìn)行出隊列操作時,它將會被阻塞,除非有另一個線程進(jìn)行了入隊列操作。

阻塞隊列主要用在生產(chǎn)者/消費(fèi)者的場景,下面這幅圖展示了一個線程生產(chǎn)、一個線程消費(fèi)的場景:

為什么需要BlockingQueue?

好處是我們不需要關(guān)心什么時候需要阻塞線程,什么時候需要喚醒線程,因為這一切BlockingQueue都給你一手包辦了。在concurrent包發(fā)布以前,在多線程環(huán)境下,我們每個程序員都必須去自己控制這些細(xì)節(jié),尤其還要兼顧效率和線程安全,而這會給我們的程序帶來不小的復(fù)雜度。

2. 認(rèn)識BlockingQueue

java.util.concurrent 包里的 BlockingQueue是一個接口,繼承Queue接口,Queue接口繼承 Collection。

BlockingQueue接口主要有以下7個實(shí)現(xiàn)類:

  1. ArrayBlockingQueue:由數(shù)組結(jié)構(gòu)組成的有界阻塞隊列。
  2. LinkedBlockingQueue:由鏈表結(jié)構(gòu)組成的有界(但大小默認(rèn)值為integer.MAX_VALUE)阻塞隊列。
  3. PriorityBlockingQueue:支持優(yōu)先級排序的無界阻塞隊列。
  4. DelayQueue:使用優(yōu)先級隊列實(shí)現(xiàn)的延遲無界阻塞隊列。
  5. SynchronousQueue:不存儲元素的阻塞隊列,也即單個元素的隊列。
  6. LinkedTransferQueue:由鏈表組成的無界阻塞隊列。
  7. LinkedBlockingDeque:由鏈表組成的雙向阻塞隊列。

BlockingQueue接口有以下幾個方法:它的方法可以分成以下4類:

拋出異常特殊值阻塞超時
插入add(e)offer(e)put(e)offer(e, time, unit)
移除remove()poll()take()poll(time, unit)
檢查element()peek()不可用不可用

① 拋出異常

add正常執(zhí)行返回true,element(不刪除)和remove返回阻塞隊列中的第一個元素? 當(dāng)阻塞隊列滿時,再往隊列里add插入元素會拋IllegalStateException:Queue full? 當(dāng)阻塞隊列空時,再往隊列里remove移除元素會拋NoSuchElementException? 當(dāng)阻塞隊列空時,再調(diào)用element檢查元素會拋出NoSuchElementException。

② 特定值

插入方法,成功ture失敗false 移除方法,成功返回出隊列的元素,隊列里沒有就返回null 檢查方法,成功返回隊列中的元素,沒有返回null。

③ 一直阻塞

如果試圖的操作無法立即執(zhí)行,該方法調(diào)用將會發(fā)生阻塞,直到能夠執(zhí)行。? 當(dāng)阻塞隊列滿時,再往隊列里put元素,隊列會一直阻塞生產(chǎn)者線程直到put數(shù)據(jù)or響應(yīng)中斷退出? 當(dāng)阻塞隊列空時,再從隊列里take元素,隊列會一直阻塞消費(fèi)者線程直到隊列可用。

④ 超時退出

如果試圖的操作無法立即執(zhí)行,該方法調(diào)用將會發(fā)生阻塞,直到能夠執(zhí)行,但等待時間不會超過給定值。? 返回一個特定值以告知該操作是否成功(典型的是 true / false)。

3. 代碼演示

public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
        // 第一組方法:add remove element
//        System.out.println(queue.add("a"));
//        System.out.println(queue.add("b"));
//        System.out.println(queue.add("c"));
//        // System.out.println(queue.add("d"));
//        // System.out.println(queue.element());
//        System.out.println(queue.remove());
//        System.out.println(queue.remove());
//        System.out.println(queue.remove());
//        //System.out.println(queue.remove());
//        //System.out.println(queue.element());
        // 第二組:offer poll peek
//        System.out.println(queue.offer("a"));
//        System.out.println(queue.offer("b"));
//        System.out.println(queue.offer("c"));
//        System.out.println(queue.offer("d"));
//        System.out.println(queue.peek());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.peek());
        // 第三組:put take
//        queue.put("a");
//        queue.put("b");
//        queue.put("c");
//        System.out.println(queue.take());
//        queue.put("d");
//        System.out.println(queue.take());
//        System.out.println(queue.take());
//        System.out.println(queue.take());
        // 第四組:offer poll
        System.out.println(queue.offer("a"));
        System.out.println(queue.offer("b"));
        System.out.println(queue.offer("c"));
        System.out.println(queue.offer("d", 5, TimeUnit.SECONDS));
    }
}

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

相關(guān)文章

  • servlet3新特性_動力節(jié)點(diǎn)Java學(xué)院整理

    servlet3新特性_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了servlet3新特性的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Maven+SSM框架實(shí)現(xiàn)簡單的增刪改查

    Maven+SSM框架實(shí)現(xiàn)簡單的增刪改查

    這篇文章主要介紹了Maven+SSM框架實(shí)現(xiàn)簡單的增刪改查,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Mybatis-plus查詢條件拒絕自動去重問題

    Mybatis-plus查詢條件拒絕自動去重問題

    文章討論了在使用MyBatis進(jìn)行多表數(shù)據(jù)關(guān)聯(lián)查詢時,由于主鍵ID重復(fù)導(dǎo)致數(shù)據(jù)被覆蓋的問題,通過在實(shí)體類中添加偽列主鍵,并在查詢中使用該偽列字段,可以確保每條數(shù)據(jù)都有一個唯一的標(biāo)識,從而避免數(shù)據(jù)被去重
    2025-12-12
  • redis實(shí)現(xiàn)多進(jìn)程數(shù)據(jù)同步工具代碼分享

    redis實(shí)現(xiàn)多進(jìn)程數(shù)據(jù)同步工具代碼分享

    這篇文章主要介紹了使用redis實(shí)現(xiàn)多進(jìn)程數(shù)據(jù)同步工具的代碼,大家參考使用吧
    2014-01-01
  • Java本地緩存實(shí)現(xiàn)代碼示例

    Java本地緩存實(shí)現(xiàn)代碼示例

    這篇文章主要給大家介紹了關(guān)于Java本地緩存實(shí)現(xiàn)的相關(guān)資料,對于緩存的作用不言而喻,可以提高查詢效率,比去DB查詢的速度要快,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • Springboot實(shí)現(xiàn)ENC加密的詳細(xì)流程

    Springboot實(shí)現(xiàn)ENC加密的詳細(xì)流程

    在項目開發(fā)過程中,需要配置數(shù)據(jù)庫連接密碼、Redis密碼、網(wǎng)盤上傳的AK/SK等敏感信息,都需要保存在配置文件里,或者配置中心,這些信息如果泄露,還是會造成一定的困擾,下面這篇文章主要給大家介紹了關(guān)于Springboot實(shí)現(xiàn)ENC加密的詳細(xì)流程,需要的朋友可以參考下
    2023-06-06
  • 一文讀懂a(chǎn)va中的Volatile關(guān)鍵字使用

    一文讀懂a(chǎn)va中的Volatile關(guān)鍵字使用

    volatile關(guān)鍵字的作用保證了變量的可見性(visibility)。被volatile關(guān)鍵字修飾的變量,如果值發(fā)生了變更,其他線程立馬可見,避免出現(xiàn)臟讀的現(xiàn)象。這篇文章主要介紹了ava中的Volatile關(guān)鍵字使用,需要的朋友可以參考下
    2020-03-03
  • 詳解Spring mvc的web.xml配置說明

    詳解Spring mvc的web.xml配置說明

    本篇文章主要介紹了Spring mvc的web.xml配置說明,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 簡單的一次springMVC路由跳轉(zhuǎn)實(shí)現(xiàn)

    簡單的一次springMVC路由跳轉(zhuǎn)實(shí)現(xiàn)

    本文主要介紹了springMVC路由跳轉(zhuǎn)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 解決spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題

    解決spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題

    這篇文章主要介紹了spring cloud zuul與nginx的域名轉(zhuǎn)發(fā)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

雅安市| 平邑县| 正镶白旗| 渝中区| 大悟县| 秦皇岛市| 邻水| 扶余县| 瑞安市| 邳州市| 清水河县| 东宁县| 丰台区| 南昌市| 天台县| 连山| 乐至县| 闻喜县| 剑河县| 即墨市| 宜兰县| 五原县| 都兰县| 泾阳县| 临猗县| 措勤县| 南岸区| 马关县| 紫金县| 南溪县| 项城市| 佛山市| 富顺县| 祥云县| 乌兰浩特市| 留坝县| 土默特右旗| 嘉善县| 汝南县| 商水县| 威宁|