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

java并發(fā)編程工具類JUC之ArrayBlockingQueue

 更新時間:2021年05月31日 15:45:34   作者:字母哥博客  
類ArrayBlockingQueue是BlockingQueue接口的實現(xiàn)類,它是有界的阻塞隊列,內(nèi)部使用數(shù)組存儲隊列元素,通過代碼給大家說明如何初始化一個ArrayBlockingQueue,并向其中添加一個對象,對java并發(fā)編程工具類ArrayBlockingQueue相關(guān)知識感興趣的朋友一起看看吧

Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一個可以存取元素,并且線程安全的隊列。換句話說,當(dāng)多線程同時從 JavaBlockingQueue中插入元素、獲取元素的時候,不會導(dǎo)致任何并發(fā)問題(元素被插入多次、處理多次等問題)。

從java BlockingQueue可以引申出一個概念:阻塞隊列,是指隊列本身可以阻塞線程向隊列里面插入元素,或者阻塞線程從隊列里面獲取元素。比如:當(dāng)一個線程嘗試去從一個空隊列里面獲取元素的時候,這個線程將被阻塞直到隊列內(nèi)元素數(shù)量不再為空。當(dāng)然,線程是否會被阻塞取決于你調(diào)用什么方法從BlockingQueue獲取元素,有的方法會阻塞線程,有的方法會拋出異常等等,下文我們會詳細介紹。

ArrayBlockingQueueBlockingQueue接口的實現(xiàn)類,它是有界的阻塞隊列,內(nèi)部使用數(shù)組存儲隊列元素。這里的“有界”是指存儲容量存在上限,不能無限存儲元素。在同一時間內(nèi)存儲容量存在著一個上限值,這個上限制在初始實例化的時候指定,之后便不能修改了。

ArrayBlockingQueue內(nèi)部采用FIFO (First In, First Out)先進先出的方法實現(xiàn)隊列數(shù)據(jù)的存取,隊首的元素是在隊列中保存時間最長的元素對象,隊尾的元素是在隊列中保存時間最短的元素對象。

下面的代碼說明如何初始化一個ArrayBlockingQueue,并向其中添加一個對象:

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

BlockingQueue可以通過泛型來限定隊列中存儲數(shù)據(jù)的類型,下面的代碼以String為泛型,表示該隊列只能存儲String類型。

BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();

實現(xiàn)一個生產(chǎn)消費的實例

在前面的文章中我們曾經(jīng)講過:BlockingQueue經(jīng)常被用于生產(chǎn)消費的緩沖隊列。下面我們就使用ArrayBlockingQueue來真正的實現(xiàn)一個生產(chǎn)消費的例子。

BlockingQueueExample開啟兩個獨立線程,一個是Producer生產(chǎn)者線程,負責(zé)向隊列中添加數(shù)據(jù);另一個是Consumer消費者線程,負責(zé)從隊列中取出數(shù)據(jù)進行處理。

public class BlockingQueueExample {

    public static void main(String[] args) throws Exception {
        //使用ArrayBlockingQueue初始化一個BlockingQueue,指定容量的上限為1024
        BlockingQueue queue = new ArrayBlockingQueue(1024);
        
        Producer producer = new Producer(queue);  //生產(chǎn)者
        Consumer consumer = new Consumer(queue);  //消費者

        new Thread(producer).start();  //開啟生產(chǎn)者線程
        new Thread(consumer).start();  //開啟消費者線程

        Thread.sleep(4000);
    }
}

Producer為生產(chǎn)者,每隔10秒鐘使用put()方法向隊列中放入一個對象,放入三次。在這10秒的間隔內(nèi),隊列數(shù)據(jù)被消費者取走之后將導(dǎo)致消費者線程阻塞。

public class Producer implements Runnable{

    protected BlockingQueue queue = null;

    public Producer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            queue.put("1");
            Thread.sleep(10000);
            queue.put("2");
            Thread.sleep(10000);
            queue.put("3");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

下面的代碼是消費者類Consumer,它從隊列中獲取待處理的元素對象,并調(diào)用System.out將其打印出來。

public class Consumer implements Runnable{

    protected BlockingQueue queue = null;

    public Consumer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            System.out.println(queue.take());
            System.out.println(queue.take());
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上面的代碼打印結(jié)果是每隔10秒打印一次,因為其中take()方法在隊列內(nèi)沒有元素可以取到的時候,會阻塞當(dāng)前的消費者線程,讓其處于等待狀態(tài),這個方法我們在上一節(jié)介紹BlockingQueue的時候就已經(jīng)進行過說明。

以上就是java并發(fā)編程工具類JUC之ArrayBlockingQueue的詳細內(nèi)容,更多關(guān)于java并發(fā)編程工具類ArrayBlockingQueue的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot+dubbo+validation 進行rpc參數(shù)校驗的實現(xiàn)方法

    springboot+dubbo+validation 進行rpc參數(shù)校驗的實現(xiàn)方法

    這篇文章主要介紹了springboot+dubbo+validation 進行rpc參數(shù)校驗的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 將Dubbo服務(wù)打包成Jar包的操作步驟

    將Dubbo服務(wù)打包成Jar包的操作步驟

    Dubbo 是一款流行的 Java RPC 框架,它提供了高性能、透明化的 RPC 遠程服務(wù)調(diào)用方案,在開發(fā)基于 Dubbo 的服務(wù)時,我們通常需要將服務(wù)代碼打包成可發(fā)布的 JAR 包,本文將詳細介紹如何將 Dubbo 服務(wù)打包成 JAR 包,并提供相應(yīng)的配置和步驟,需要的朋友可以參考下
    2024-12-12
  • Java調(diào)用ChatGPT的實現(xiàn)代碼

    Java調(diào)用ChatGPT的實現(xiàn)代碼

    這篇文章主要介紹了Java調(diào)用ChatGPT的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • 95%的Java程序員人都用不好Synchronized詳解

    95%的Java程序員人都用不好Synchronized詳解

    這篇文章主要為大家介紹了95%的Java程序員人都用不好Synchronized詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 基于Java HttpClient和Htmlparser實現(xiàn)網(wǎng)絡(luò)爬蟲代碼

    基于Java HttpClient和Htmlparser實現(xiàn)網(wǎng)絡(luò)爬蟲代碼

    這篇文章主要介紹了基于Java HttpClient和Htmlparser實現(xiàn)網(wǎng)絡(luò)爬蟲代碼的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • 解析Mybatis的insert方法返回數(shù)字-2147482646的解決

    解析Mybatis的insert方法返回數(shù)字-2147482646的解決

    這篇文章主要介紹了解析Mybatis的insert方法返回數(shù)字-2147482646的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringBoot集成POI實現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解

    SpringBoot集成POI實現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解

    Apache?POI?是用Java編寫的免費開源的跨平臺的?Java?API,Apache?POI提供API給Java程序?qū)icrosoft?Office格式檔案讀和寫的功能。本文主要介紹通過SpringBoot集成POI工具實現(xiàn)Excel的導(dǎo)入和導(dǎo)出功能,需要的可以參考一下
    2022-07-07
  • 猜數(shù)游戲java實現(xiàn)代碼

    猜數(shù)游戲java實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了java實現(xiàn)猜數(shù)游戲代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Java中的內(nèi)存分配圖解

    Java中的內(nèi)存分配圖解

    這篇文章主要介紹了Java中的內(nèi)存分配圖解,Java 程序運行時,需要在內(nèi)存中分配空間。為了提高運算效率,就對空間進行了不同區(qū)域的劃分,因為每一片區(qū)域都有特定的處理數(shù)據(jù)方式和內(nèi)存管理方式,需要的朋友可以參考下
    2023-08-08
  • java安全編碼指南之:對象構(gòu)建操作

    java安全編碼指南之:對象構(gòu)建操作

    這篇文章主要介紹了java安全編碼指南之:對象構(gòu)建操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

阳江市| 滦平县| 长汀县| 鸡东县| 金平| 孟津县| 安远县| 疏附县| 通化县| 城市| 英山县| 广水市| 临高县| 汾阳市| 合水县| 鄂托克前旗| 叙永县| 驻马店市| 志丹县| 清丰县| 景宁| 镇坪县| 鹤峰县| 永清县| 秀山| 会泽县| 海南省| 白朗县| 桦甸市| 镇原县| 称多县| 文成县| 观塘区| 普兰店市| 日照市| 庆阳市| 临江市| 普定县| 永清县| 青河县| 大冶市|