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

阻塞隊列.

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

目錄

?什么是阻塞隊列

?什么是生產(chǎn)-消費者模式

?實現(xiàn)一個阻塞隊列

?BlockingQueue


?什么是阻塞隊列

阻塞隊列是一種特殊的隊列,它除了具備隊列的先進先出的特點外,還具有以下特點:

?.如果隊列為空時,執(zhí)行出隊列操作,會阻塞等待,直到另一個線程往隊列里添加元素(隊列不為空)

?.如果隊列滿了時,執(zhí)行入隊列操作,會阻塞等待,直到另一個線程取出隊列里的元素(隊列沒有滿)

阻塞隊列常用于實現(xiàn)生產(chǎn)者-消費者模式,通過控制隊列的阻塞,使得生產(chǎn)者和消費者的協(xié)作更加有效和高效。下面我們先簡單認識下生產(chǎn)者-消費者模式~

?什么是生產(chǎn)-消費者模式

生產(chǎn)者消費者模式是一種常見的并發(fā)編程模式。該模式主要針對一個共享的緩沖區(qū),多個生產(chǎn)者可以向緩沖區(qū)中添加數(shù)據(jù),多個消費者可以從緩沖區(qū)中獲取數(shù)據(jù)。在該模式中,生產(chǎn)者向緩沖區(qū)中添加數(shù)據(jù),如果緩沖區(qū)已滿,則生產(chǎn)者需要等待消費者消費完一部分數(shù)據(jù)后再向緩沖區(qū)添加數(shù)據(jù);消費者從緩沖區(qū)中獲取數(shù)據(jù),如果緩沖區(qū)為空,則消費者需要等待生產(chǎn)者生產(chǎn)數(shù)據(jù)后再從緩沖區(qū)中獲取數(shù)據(jù)。生產(chǎn)者和消費者之間通過緩沖區(qū)進行通信和協(xié)調(diào),而緩沖區(qū)就可以由阻塞隊列構(gòu)成。

一個典型的生產(chǎn)者-消費者模式的例子是吃酒席的時候:后廚(生產(chǎn)者)端菜到餐桌(阻塞隊列)上,賓客(消費者)從餐桌(阻塞隊列)上取走事物食用,當餐桌放滿了食物,后廚就要等賓客吃完一碟再上,當餐桌上沒有食物,賓客就得等后廚上菜后再吃。

使用生產(chǎn)者-消費者模式有以下兩點好處:

?.有效降低生產(chǎn)者和消費者之間的耦合:生產(chǎn)者和消費者之間通過阻塞隊列進行交互,彼此之間沒有直接關(guān)聯(lián)

?.平衡生產(chǎn)者和消費者之間的速度差異:由于阻塞隊列的特性,平衡了兩者的速度差異,保證了系統(tǒng)的穩(wěn)定性

?實現(xiàn)一個阻塞隊列

我們先通過數(shù)組,實現(xiàn)一個普通的循環(huán)隊列:

public class MyBlockingQueue {
    private int[] items;
    private int head;
    private int tail;
    private int size;

    public MyBlockingQueue() {
        items = new int[1000];
        head = 0;
        tail = 0;
        //隊列中元素的有效個數(shù)
        size = 0;
    }
    
    //入隊列
    public void put(int value) {
        //隊列滿了
        if (size == items.length) {
            return;
        }
        //隊列沒滿
        items[tail] = value;
        tail = (tail + 1) % items.length;
        size++;
    }
    
    //出隊列
    public int take() {
        //隊列為空
        if (size == 0) {
            return -1;
        }
        //隊列不為空
        int value = items[head];
        head = (head + 1) % items.length;
        size--;
        return value;
    }
}

再對隊列填加阻塞功能,并保證線程安全:

public class MyBlockingQueue {
    private int[] items;
    private int head;
    private int tail;
    private volatile int size;

    public MyBlockingQueue() {
        items = new int[1000];
        head = 0;
        tail = 0;
        //隊列中元素的有效個數(shù)
        size = 0;
    }

    //入隊列
    public void put(int value) throws InterruptedException {
        synchronized (this) {
            //隊列滿了
            // 此處最好使用 while,否則 notifyAll 的時候, 該線程從 wait 中被喚醒
            // 但是緊接著并未搶占到鎖. 當鎖被搶占的時候, 可能又已經(jīng)隊列滿了,就只能繼續(xù)等待
            while (size == items.length) {
                wait();
            }
            //隊列沒滿
            items[tail] = value;
            tail = (tail + 1) % items.length;
            size++;
            notifyAll();
        }
    }

    //出隊列
    public int take() throws InterruptedException {
        int value = 0;
        synchronized (this) {
            //隊列為空
            // 此處最好使用 while,否則 notifyAll 的時候, 該線程從 wait 中被喚醒
            // 但是緊接著并未搶占到鎖. 當鎖被搶占的時候, 可能又已經(jīng)隊列滿了,就只能繼續(xù)等待
            while (size == 0) {
                wait();
            }
            //隊列不為空
            value = items[head];
            head = (head + 1) % items.length;
            size--;
            notifyAll();
        }
        return value;
    }
}

?BlockingQueue

阻塞隊列.,java,開發(fā)語言

?.BlockingQueue是concurrent包下的一個接口,是Java標準庫中內(nèi)置的阻塞隊列。

?.BlockingQueue除了保留Queue的offer、poll、peek方法外,還提供了帶有阻塞功能的入隊列方法:put()和帶有阻塞功能的出隊列方法:take()。

?.BlockingQueue的實現(xiàn)類有:

①.LinkedBlockingQueue:基于鏈表實現(xiàn)的阻塞隊列。

②.PriorityBlockingQueue:基于優(yōu)先級隊列(堆)實現(xiàn)的阻塞隊列。③.ArrayBlockingQueue:基于數(shù)組實現(xiàn)的阻塞隊列。

知道了BlockingQueue的基本信息,接下來我們來使用BlockingQueue實現(xiàn)一個生產(chǎn)者-消費者模式:

class Test {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<Integer> blockingQueue = new LinkedBlockingQueue<Integer>();
        Thread customer = new Thread(()->{
            while (true) {
                try {
                    int value = blockingQueue.take();
                    System.out.println("消費者:" + value);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        Thread producer = new Thread(()->{
            Random random = new Random();
            while (true) {
                try {
                    int value = random.nextInt(1000);
                    blockingQueue.put(value);
                    System.out.println("生產(chǎn)者:" + value);
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        customer.start();
        producer.start();
        customer.join();
        producer.join();
    }
}

由于在producer線程中sleep(100),所以producer線程入隊列會很慢,producer線程一入隊列就被customer線程取出:

阻塞隊列.,java,開發(fā)語言

注:由于兩個線程的輸出語句是并行執(zhí)行,故先打印生產(chǎn)者還是消費者是不確定的文章來源地址http://www.zghlxwxcb.cn/news/detail-717239.html

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

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

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

相關(guān)文章

  • 【Java】多線程案例(單例模式,阻塞隊列,定時器,線程池)

    【Java】多線程案例(單例模式,阻塞隊列,定時器,線程池)

    ?? Author: 老九 ?? 個人博客:老九的CSDN博客 ?? 個人名言:不可控之事 樂觀面對 ?? 系列專欄: 單例模式是設計模式之一。代碼當中的某個類,只能有一個實例,不能有多個。單例模式分為:餓漢模式和懶漢模式 餓漢模式表示很著急,就想吃完飯剩下很多碗,然后一

    2024年02月06日
    瀏覽(51)
  • java高并發(fā)系列 - 第25天:掌握JUC中的阻塞隊列

    這是java高并發(fā)系列第25篇文章。 環(huán)境:jdk1.8。 本文內(nèi)容 掌握Queue、BlockingQueue接口中常用的方法 介紹6中阻塞隊列,及相關(guān)場景示例 重點掌握4種常用的阻塞隊列 Queue接口 隊列是一種先進先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),java中用Queue接口來表示隊列。 Queue接口中定義了6個方法:

    2024年02月14日
    瀏覽(58)
  • Java 多線程系列Ⅳ(單例模式+阻塞式隊列+定時器+線程池)

    Java 多線程系列Ⅳ(單例模式+阻塞式隊列+定時器+線程池)

    設計模式就是軟件開發(fā)中的“棋譜”,軟件開發(fā)中也有很多常見的 “問題場景”。針對這些問題場景,大佬們總結(jié)出了一些固定的套路。按照這些套路來實現(xiàn)代碼可能不會很好,但至少不會很差。當前階段我們需要掌握兩種設計模式: (1)單例模式 (2)工廠模式 概念/特征

    2024年02月09日
    瀏覽(25)
  • 【Java系列】多線程案例學習——基于阻塞隊列實現(xiàn)生產(chǎn)者消費者模型

    【Java系列】多線程案例學習——基于阻塞隊列實現(xiàn)生產(chǎn)者消費者模型

    個人主頁:兜里有顆棉花糖 歡迎 點贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【Java系列專欄】【JaveEE學習專欄】 本專欄旨在分享學習JavaEE的一點學習心得,歡迎大家在評論區(qū)交流討論?? 什么是阻塞式隊列(有兩點): 第一點:當隊列滿的時候

    2024年02月04日
    瀏覽(23)
  • 【Java多線程】關(guān)于多線程的一些案例 —— 單例模式中的餓漢模式和懶漢模式以及阻塞隊列

    【Java多線程】關(guān)于多線程的一些案例 —— 單例模式中的餓漢模式和懶漢模式以及阻塞隊列

    目錄 1、單例模式 1.1、餓漢模式 2.1、懶漢模式? 2、阻塞隊列 2.1、BlockingQueue 阻塞隊列數(shù)據(jù)結(jié)構(gòu) 對框架和設計模式的簡單理解就是,這兩者都是“大佬”設計出來的,讓即使是一個代碼寫的不太好的“菜雞程序員”也能寫出還可以的代碼。 設計模式也可以認為是對編程語言語

    2024年03月23日
    瀏覽(27)
  • Java - JUC(java.util.concurrent)包詳解,其下的鎖、安全集合類、線程池相關(guān)、線程創(chuàng)建相關(guān)和線程輔助類、阻塞隊列

    Java - JUC(java.util.concurrent)包詳解,其下的鎖、安全集合類、線程池相關(guān)、線程創(chuàng)建相關(guān)和線程輔助類、阻塞隊列

    JUC是java.util.concurrent包的簡稱,在Java5.0添加,目的就是為了更好的支持高并發(fā)任務。讓開發(fā)者進行多線程編程時減少競爭條件和死鎖的問題 java.lang.Thread.State tools(工具類):又叫信號量三組工具類,包含有 CountDownLatch(閉鎖) 是一個同步輔助類,在完成一組正在其他線程中

    2024年02月05日
    瀏覽(22)
  • 微服務---Redis實用篇-黑馬頭條項目-優(yōu)惠卷秒殺功能(使用java阻塞隊列對秒殺進行異步優(yōu)化)

    微服務---Redis實用篇-黑馬頭條項目-優(yōu)惠卷秒殺功能(使用java阻塞隊列對秒殺進行異步優(yōu)化)

    1.1 秒殺優(yōu)化-異步秒殺思路 我們來回顧一下下單流程 當用戶發(fā)起請求,此時會請求nginx,nginx會訪問到tomcat,而tomcat中的程序,會進行串行操作,分成如下幾個步驟 1、查詢優(yōu)惠卷 2、判斷秒殺庫存是否足夠 3、查詢訂單 4、校驗是否是一人一單 5、扣減庫存 6、創(chuàng)建訂單 在這六

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

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

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

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

    阻塞隊列(消息隊列)

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

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

    阻塞隊列BlockingQueue

    先進先出的數(shù)據(jù)結(jié)構(gòu),允許出隊的一端稱為隊頭,允許入隊的一端稱為隊尾。 在java中為隊列定義了一個接口規(guī)范 Queue 接口 阻塞隊列提供了線程安全的隊列訪問方式。 多線程入隊互斥,多線程出隊互斥,隊列滿了阻塞生產(chǎn)者線程,隊列空了阻塞消費者線程 阻塞隊列的接口

    2023年04月09日
    瀏覽(11)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包