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

阻塞隊(duì)列BlockingQueue

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

阻塞隊(duì)列BlockingQueue

隊(duì)列

先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),允許出隊(duì)的一端稱為隊(duì)頭,允許入隊(duì)的一端稱為隊(duì)尾。

阻塞隊(duì)列BlockingQueue

在java中為隊(duì)列定義了一個(gè)接口規(guī)范Queue接口

public interface Queue<E> extends Collection<E> {
   
    //添加一個(gè)元素,添加成功返回true, 如果隊(duì)列滿了,就會(huì)拋出異常
    boolean add(E e);
    
    //添加一個(gè)元素,添加成功返回true, 如果隊(duì)列滿了,返回false
    boolean offer(E e);
    
    //返回并刪除隊(duì)首元素,隊(duì)列為空則拋出異常
    E remove();
    
    //返回并刪除隊(duì)首元素,隊(duì)列為空則返回null
    E poll();
    
    //返回隊(duì)首元素,但不移除,隊(duì)列為空則拋出異常
    E element();
    
    //獲取隊(duì)首元素,但不移除,隊(duì)列為空則返回null
    E peek();
}



阻塞隊(duì)列

阻塞隊(duì)列提供了線程安全的隊(duì)列訪問方式。多線程入隊(duì)互斥,多線程出隊(duì)互斥,隊(duì)列滿了阻塞生產(chǎn)者線程,隊(duì)列空了阻塞消費(fèi)者線程

阻塞隊(duì)列的接口BlockingQueue 它繼承了 Queue接口。并在原有Queue接口定義的方法規(guī)范下,再新增了兩個(gè)關(guān)于阻塞的方法規(guī)范。

public interface BlockingQueue<E> extends Queue<E> {
   

    // 阻塞方式 入隊(duì)
    void put(E e) throws InterruptedException;

    // 阻塞方式 出隊(duì)
    E take() throws InterruptedException;

   ......

}



方法 拋出異常 返回特定值 阻塞 阻塞特定時(shí)間
入隊(duì) add(e) offer(e) put(e) offer(e, time, unit)
出隊(duì) remove() poll() take() poll(time, unit)
獲取隊(duì)首元素 element() peek() 不支持 不支持

阻塞隊(duì)列的應(yīng)用場(chǎng)景

  • 線程池
  • 生產(chǎn)者-消費(fèi)者模型
  • 消息隊(duì)列
  • 緩存系統(tǒng)
  • 并發(fā)任務(wù)處理

BlockingQueue 接口的實(shí)現(xiàn)類都被放在了 juc 包中,它們的區(qū)別主要體現(xiàn)在存儲(chǔ)結(jié)構(gòu)上或?qū)υ夭僮魃系牟煌?,但是?duì)于take與put操作的原理卻是類似的。

隊(duì)列 描述
ArrayBlockingQueue 基于數(shù)組結(jié)構(gòu)實(shí)現(xiàn)的一個(gè)有界阻塞隊(duì)列
LinkedBlockingQueue 基于鏈表結(jié)構(gòu)實(shí)現(xiàn)的一個(gè)無界阻塞隊(duì)列,指定容量為有界阻塞隊(duì)列
PriorityBlockingQueue 支持按優(yōu)先級(jí)排序的無界阻塞隊(duì)列
DelayQueue 基于優(yōu)先級(jí)隊(duì)列(PriorityBlockingQueue)實(shí)現(xiàn)的無界阻塞隊(duì)列
SynchronousQueue 不存儲(chǔ)元素的阻塞隊(duì)列
LinkedTransferQueue 基于鏈表結(jié)構(gòu)實(shí)現(xiàn)的一個(gè)無界阻塞隊(duì)列
LinkedBlockingDeque 基于鏈表結(jié)構(gòu)實(shí)現(xiàn)的一個(gè)雙端阻塞隊(duì)列

詳情



ArrayBlockingQueue

簡(jiǎn)介

ArrayBlockingQueue它隊(duì)列使用的數(shù)據(jù)結(jié)構(gòu)是雙指針的環(huán)形數(shù)組,入隊(duì)出隊(duì)是基于生產(chǎn)者消費(fèi)者模型實(shí)現(xiàn)的,它入隊(duì)和出隊(duì)使用的是同一把鎖。


基本使用

BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");   //向隊(duì)列中添加元素
Object object = queue.take();   //從隊(duì)列中取出元素

其實(shí)ava.util.concurrent.locks.Condition接口的注釋中 給出的案例就和ArrayBlockingQueue的實(shí)現(xiàn)很相似,如下所示使用一個(gè)環(huán)形數(shù)組實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式:文章來源地址http://www.zghlxwxcb.cn/news/detail-406720.html

class BoundedBuffer {
   
    final Lock lock = new ReentrantLock();
    final Condition notFull  = lock.newCondition(); 
    final Condition notEmpty = lock.newCondition(); 

    final Object[] items = new Object[100];
    int putptr, takeptr, count;

    // 生產(chǎn)者,把方法的入?yún)⑼?duì)列中存,隊(duì)列是一個(gè)環(huán)形數(shù)組
    public void put(Object x) throws InterruptedException {
   
        lock.lock();
        try {
   
            
            // 隊(duì)列放滿了生產(chǎn)者就阻塞
            while (count == items.length)
                notFull.await();
            
            // 往隊(duì)列存數(shù)據(jù)
            items[putptr] = x;
            if (++putptr == items.length) putptr = 0;
            
            // 隊(duì)列中新存值了,要通知消費(fèi)者開始消費(fèi)了
            ++count;
            notEmpty.signal();
        } finally {
   
            lock.unlock();
        }
    }

    // 消費(fèi)者,從隊(duì)列中取
    public Object take() throws InterruptedException {
   
        lock.lock();
        try {
   
            
            // 隊(duì)列空了,消費(fèi)者就阻塞
            while (count == 0)
                notEmpty.await();
            
            // 從隊(duì)列中取值
            Object x = items[takeptr];
            if (++takeptr == items.length) takeptr = 0;
            
            // 已經(jīng)消費(fèi)了,隊(duì)列現(xiàn)在不是滿的了,喚醒生產(chǎn)者進(jìn)行生產(chǎn)
            --count;
            notFull.signal();
            return x;
        } finally {
   
            lock.unlock();
        }
    }

到了這里,關(guān)于阻塞隊(duì)列BlockingQueue的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 什么是Java中的阻塞隊(duì)列和非阻塞隊(duì)列?

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

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

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

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

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

    阻塞隊(duì)列(消息隊(duì)列)

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

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

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

    2024年02月04日
    瀏覽(18)
  • 阻塞隊(duì)列(JAVA)

    阻塞隊(duì)列(JAVA)

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

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

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

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

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

    阻塞隊(duì)列是什么

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

    2024年02月13日
    瀏覽(15)
  • 阻塞隊(duì)列.

    阻塞隊(duì)列.

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

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

    Qt QQueue 安全的多線程隊(duì)列、阻塞隊(duì)列

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

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

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

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

    2024年02月02日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包