国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

BlockingQueue阻塞隊列

這篇具有很好參考價值的文章主要介紹了BlockingQueue阻塞隊列。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

BlockingQueue阻塞隊列

BlockingQueue簡介

juc包下,BlockingQueue很好的解決了多線程中,高效安全的"傳輸數(shù)據(jù)"問題。
阻塞隊列,是一個隊列,可以是數(shù)據(jù)從隊列的一端輸入,從另一端輸出。
BlockingQueue阻塞隊列
當(dāng)隊列空時,從隊列獲取元素線程被阻塞,直到其他線程向空的隊列插入新元素。
當(dāng)隊列滿時,向隊列添加元素線程被阻塞,直到其他線程從隊列中移除一個或多個元素或者完全清空,使隊列變得空閑起來后新增。
在多線程中,阻塞是指在某些情況下,掛起線程,一旦條件滿足,被掛起的線程被自動喚醒。

隊列和棧

隊列 FIFO(先進先出)
棧 FILO(先進后出)

常用的BlockingQueue子類

ArrayBlockingQueue(常用)

由數(shù)組結(jié)構(gòu)組成的有界阻塞隊列。

LinkedBlockingQueue(常用)

由鏈表結(jié)構(gòu)組成的有界(大小默認(rèn)值為Integer.MAX_VALUE)阻塞隊列。

DelayQueue

使用優(yōu)先級隊列實現(xiàn)的延遲無界阻塞隊列。

PriorityBlockingQueue

支持優(yōu)先級排序的無界阻塞隊列。

SynchronousQueue

該隊列在創(chuàng)建時,有兩種模式,公平和非公平。
公平模式會采用公平鎖,并使用隊列來阻塞多余的生成者和消費者,從而實現(xiàn)整體的公平策略。
非公平模式,采用非公平鎖,且使用棧來阻塞多余的生產(chǎn)者和消費者,這種模式下,如果生產(chǎn)者和消費者的處理速度存在差距,則很容易出現(xiàn)饑渴的情況,即可能出現(xiàn)生產(chǎn)不足(消費者在等待生產(chǎn)者),或者生產(chǎn)過剩(有些元素,永遠(yuǎn)不會被消費)。
總結(jié),不存儲元素的同步隊列,即存儲單個元素的對列。

LinkedBlockingDeque

由鏈表組成的雙休阻塞隊列。

BlockingQueue核心方法

BlockingQueue阻塞隊列

方法使用代碼
/**
 * @author 長名06
 * @version 1.0
 */
public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);

        //第一組
        //add方法無空間可添加元素,拋IllegalStateException("Queue full")異常 有空間可添加元素,返回true
//        System.out.println(blockingQueue.add("wind-風(fēng)"));//
//        System.out.println(blockingQueue.add("flower-花"));
//        System.out.println(blockingQueue.add("snow-雪"));
//        System.out.println(blockingQueue.add("moon-月"));
        //System.out.println(blockingQueue.element());

          //remove方法,無元素可用,拋NoSuchElementException異常 有元素可用,返回元素
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());

        //第二組
        //offer(E e)方法 無空間可添加元素,返回false 有空間可用添加元素,返回true
        //還存在offer(E e)的重載方法offer(E e, long timeout, TimeUnit unit) 對應(yīng)第四組
        //無空間可添加元素,會等待一段時間,看是否有空間可用添加元素,等待時間內(nèi)有,添加 沒有就返回false
        //有空間可用添加元素,返回true
//        System.out.println(blockingQueue.offer("wind-風(fēng)"));
//        System.out.println(blockingQueue.offer("flower-花"));
//        System.out.println(blockingQueue.offer("snow-雪"));
//        System.out.println(blockingQueue.offer("moon-月"));
//
          //poll方法,無元素可用,返回null 有元素可用,返回元素
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
        //第三組
        //put方法注釋
        //Inserts the specified element into this queue, waiting if necessary for space to become available.
        //put方法,如果隊列已滿,就一直等待,直到隊列可用添加元素 put方法無返回值
        blockingQueue.put("wind-風(fēng)");
        blockingQueue.put("flower-花");
        blockingQueue.put("snow-雪");
        System.out.println("隊列已滿");
        System.out.println(blockingQueue.offer("moon-月", 3L, TimeUnit.SECONDS));
//        blockingQueue.put("moon-月");

        //take方法注釋
        //Retrieves and removes the head of this queue, waiting if necessary until an element becomes available.
        //take方法,不為空返回元素 如果隊列為空,就一直阻塞,等待隊列中有元素可用
//        System.out.println(blockingQueue.take());
//        System.out.println(blockingQueue.take());
//        System.out.println(blockingQueue.take());
//        System.out.println("隊列已空");
//        blockingQueue.take();

        //第四組
        //poll方法注釋
        //Retrieves and removes the head of this queue, waiting up to the specified wait time if necessary for an element to become available.
        //poll方法,取元素,如果隊列不為空,返回元素
        // 如果隊列為空,會等待一段時間,看是否有元素可用,沒有就返回null
        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
//        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
    }
}

只是為了記錄自己的學(xué)習(xí)歷程,且本人水平有限,不對之處,請指正。文章來源地址http://www.zghlxwxcb.cn/news/detail-747389.html

到了這里,關(guān)于BlockingQueue阻塞隊列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 什么是Java中的阻塞隊列和非阻塞隊列?

    首先,讓我們從基礎(chǔ)概念開始。在計算機科學(xué)中,數(shù)據(jù)結(jié)構(gòu)可以分為兩種:隊列和管道。隊列是一種先進先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),你可以想象成排隊買電影票的情況。你加入隊伍的時候,你可以決定站在哪里,但是一旦決定站在哪里,你就不能改變位置。而一旦你到達(dá)隊尾,

    2024年02月14日
    瀏覽(33)
  • 【數(shù)據(jù)結(jié)構(gòu)-隊列】阻塞隊列

    【數(shù)據(jù)結(jié)構(gòu)-隊列】阻塞隊列

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年02月09日
    瀏覽(25)
  • 阻塞隊列(消息隊列)

    阻塞隊列(消息隊列)

    隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu)。而阻塞隊列也是一種特殊的隊列,也遵守”先進先出“的原則。 阻塞隊列是一種線程安全的的數(shù)據(jù)結(jié)構(gòu),并且具有以下 特性 : 1、隊列往進寫元素是從隊尾插入,隊首取出 2、當(dāng)插入元素的時候,先判斷一下,隊列是否已經(jīng)滿了,如果滿了就

    2024年02月11日
    瀏覽(14)
  • 阻塞隊列(JAVA)

    阻塞隊列(JAVA)

    阻塞隊列是一種特殊的隊列,也遵守 \\\"先進先出\\\" 的原則。 阻塞隊列能是一種 線程安全的數(shù)據(jù)結(jié)構(gòu) , 并且具有以下特性: 當(dāng)隊列滿的時候, 繼續(xù)入隊列就會阻塞, 直到有其他線程從隊列中取走元素; 當(dāng)隊列空的時候, 繼續(xù)出隊列也會阻塞, 直到有其他線程往隊列中插入元素。 ?

    2024年02月02日
    瀏覽(18)
  • 阻塞隊列的原理及應(yīng)用

    阻塞隊列的原理及應(yīng)用

    阻塞隊列是一種常用的并發(fā)編程工具,它能夠在多線程環(huán)境下提供一種安全而高效的數(shù)據(jù)傳輸機制。本文將介紹阻塞隊列的原理和使用場景,并通過實例演示其在多線程編程中的應(yīng)用。 阻塞隊列是一種特殊的隊列,它具有以下幾個特點: 阻塞特性:當(dāng)隊列為空時,從隊列中

    2024年02月10日
    瀏覽(14)
  • 阻塞隊列是什么

    阻塞隊列是什么

    (1) 棧與隊列 1)棧:先進后出,后進先出 2)隊列:先進先出 (2) 阻塞隊列 阻塞:必須要阻塞/不得不阻塞 阻塞隊列是一個隊列,在數(shù)據(jù)結(jié)構(gòu)中起的作用如下圖: 1)當(dāng)隊列是空的,從隊列中獲取元素的操作將會被阻塞。 2)當(dāng)隊列是滿的,從隊列中添加元素的操作將會被阻塞

    2024年02月13日
    瀏覽(15)
  • 10.阻塞隊列和線程池

    阻塞隊列(BlockQueue) 非阻塞方法 add 往滿的隊列中添加元素會報錯 remove 從空的隊列中移除元素會報錯 offer 往滿的隊列中添加元素會返回false poll 從空的隊列中移除元素會返回null 阻塞方法 put take 使用場景: 阻塞隊列通常使用在生產(chǎn)者消費者設(shè)計模式當(dāng)中,生產(chǎn)者不用關(guān)心生成的

    2024年02月04日
    瀏覽(19)
  • 阻塞隊列.

    阻塞隊列.

    目錄 ?什么是阻塞隊列 ?什么是生產(chǎn)-消費者模式 ?實現(xiàn)一個阻塞隊列 ?BlockingQueue 阻塞隊列是一種特殊的隊列,它除了具備隊列的先進先出的特點外,還具有以下特點: ?. 如果隊列為空時,執(zhí)行出隊列操作,會阻塞等待,直到另一個線程往隊列里添加元素(隊列不為空)

    2024年02月08日
    瀏覽(16)
  • Qt QQueue 安全的多線程隊列、阻塞隊列

    Qt QQueue 安全的多線程隊列、阻塞隊列

    在C++中,queue是一個模板類,用于實現(xiàn)隊列數(shù)據(jù)結(jié)構(gòu),遵循先進先出的原則。 ? 常用方法: · ? 簡單使用: · ? 打?。?· QQueue 繼承與 QList ? 常用方法: · ? 實例: · ? 打?。?· 在多線程編程中,由于QQueue并不是線程安全的,因此我們需要先使用互斥鎖(QMutex)來保

    2024年02月16日
    瀏覽(22)
  • 【Linux驅(qū)動】Linux阻塞IO —— 阻塞讀取按鍵狀態(tài)(等待隊列實現(xiàn))

    【Linux驅(qū)動】Linux阻塞IO —— 阻塞讀取按鍵狀態(tài)(等待隊列實現(xiàn))

    上一節(jié)獲取按鍵狀態(tài)時,是在應(yīng)用層以循環(huán)的方式不斷讀取按鍵狀態(tài),但是我們實際關(guān)注的只是當(dāng)按鍵被按下時發(fā)生的情況,所以大多數(shù)時間拿到的狀態(tài)都是我們不需要的結(jié)果。 對此,當(dāng)按鍵被釋放時,讓 read 接口處于阻塞狀態(tài),等按鍵被按下再解除阻塞。 要使用等待隊列

    2024年02月02日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包