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

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

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

棧與隊(duì)列概念

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

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

1. 什么是BlockingQueue

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

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

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

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

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

為什么需要BlockingQueue?

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

2. 認(rèn)識(shí)BlockingQueue

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

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

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

BlockingQueue接口有以下幾個(gè)方法:它的方法可以分成以下4類(lèi):

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

① 拋出異常

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

② 特定值

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

③ 一直阻塞

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

④ 超時(shí)退出

如果試圖的操作無(wú)法立即執(zhí)行,該方法調(diào)用將會(huì)發(fā)生阻塞,直到能夠執(zhí)行,但等待時(shí)間不會(huì)超過(guò)給定值。? 返回一個(gè)特定值以告知該操作是否成功(典型的是 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中阻塞隊(duì)列BlockingQueue的詳解的文章就介紹到這了,更多相關(guān)Java阻塞隊(duì)列BlockingQueue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 教你利用springboot集成swagger并生成接口文檔

    教你利用springboot集成swagger并生成接口文檔

    有很多小伙伴不會(huì)利用springboot集成swagger并生成接口文檔,今天特地整理了這篇文章,文中有非常詳細(xì)的代碼圖文介紹及代碼示例,對(duì)不會(huì)這個(gè)方法的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • 與眾不同的 Java 日期格式化大全

    與眾不同的 Java 日期格式化大全

    這篇文章主要介紹了與眾不同的 Java 日期格式化大全,在 Java 中,經(jīng)常要將時(shí)間字符串轉(zhuǎn)換為日期,或者要將日期轉(zhuǎn)換為時(shí)間字符串。,需要的朋友可以參考下
    2019-06-06
  • java  使用URLDecoder和URLEncoder對(duì)中文進(jìn)行處理

    java 使用URLDecoder和URLEncoder對(duì)中文進(jìn)行處理

    這篇文章主要介紹了java 使用URLDecoder和URLEncoder對(duì)中文進(jìn)行處理的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Springboot配置Swagger的實(shí)現(xiàn)示例

    Springboot配置Swagger的實(shí)現(xiàn)示例

    Swagger 是一種提高 API 開(kāi)發(fā)和維護(hù)效率的工具,它使開(kāi)發(fā)者能夠更輕松地構(gòu)建、測(cè)試和文檔化 API,本文主要介紹了Springboot配置Swagger的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2023-10-10
  • Deep Module深模塊之軟件設(shè)計(jì)

    Deep Module深模塊之軟件設(shè)計(jì)

    這篇文章主要介紹了軟件設(shè)計(jì)之Deep Module深模塊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Java中反射的20個(gè)使用技巧分享

    Java中反射的20個(gè)使用技巧分享

    Java反射是一種強(qiáng)大的機(jī)制,允許程序在運(yùn)行時(shí)檢查和操作類(lèi),接口,字段和方法,本文總結(jié)了20個(gè)關(guān)于Java反射的經(jīng)驗(yàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-05-05
  • Java中bcrypt算法實(shí)現(xiàn)密碼加密的方法步驟

    Java中bcrypt算法實(shí)現(xiàn)密碼加密的方法步驟

    我們可以在Spring Boot和SSM中實(shí)現(xiàn)密碼加密,使用bcrypt算法可以保障密碼的安全性,并且減少了手動(dòng)編寫(xiě)哈希函數(shù)的工作量,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下
    2023-08-08
  • 你真的會(huì)使用Java的方法引用嗎

    你真的會(huì)使用Java的方法引用嗎

    這篇文章主要給大家介紹了關(guān)于Java方法引用的相關(guān)資料,方法引用是Java8的新特性,方法引用其實(shí)也離不開(kāi)Lambda表達(dá)式,本文通過(guò)示例代碼介紹的很詳細(xì),需要的朋友可以參考下
    2021-08-08
  • maven倉(cāng)庫(kù)repositories和mirrors的配置及區(qū)別詳解

    maven倉(cāng)庫(kù)repositories和mirrors的配置及區(qū)別詳解

    這篇文章主要介紹了maven倉(cāng)庫(kù)repositories和mirrors的配置及區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java實(shí)現(xiàn)添加、驗(yàn)證PDF數(shù)字簽名的方法示例

    Java實(shí)現(xiàn)添加、驗(yàn)證PDF數(shù)字簽名的方法示例

    在設(shè)置文檔內(nèi)容保護(hù)的方法中,除了對(duì)文檔加密、添加水印外,應(yīng)用數(shù)字簽名也是一種有效防偽手段。本文就使用Java實(shí)現(xiàn)添加、驗(yàn)證PDF數(shù)字簽名,感興趣的可以了解一下
    2021-07-07

最新評(píng)論