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

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

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

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

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

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

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

下面的代碼說(shuō)明如何初始化一個(gè)ArrayBlockingQueue,并向其中添加一個(gè)對(duì)象:

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

BlockingQueue可以通過(guò)泛型來(lái)限定隊(duì)列中存儲(chǔ)數(shù)據(jù)的類(lèi)型,下面的代碼以String為泛型,表示該隊(duì)列只能存儲(chǔ)String類(lèi)型。

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

實(shí)現(xiàn)一個(gè)生產(chǎn)消費(fèi)的實(shí)例

在前面的文章中我們?cè)?jīng)講過(guò):BlockingQueue經(jīng)常被用于生產(chǎn)消費(fèi)的緩沖隊(duì)列。下面我們就使用ArrayBlockingQueue來(lái)真正的實(shí)現(xiàn)一個(gè)生產(chǎn)消費(fèi)的例子。

類(lèi)BlockingQueueExample開(kāi)啟兩個(gè)獨(dú)立線(xiàn)程,一個(gè)是Producer生產(chǎn)者線(xiàn)程,負(fù)責(zé)向隊(duì)列中添加數(shù)據(jù);另一個(gè)是Consumer消費(fèi)者線(xiàn)程,負(fù)責(zé)從隊(duì)列中取出數(shù)據(jù)進(jìn)行處理。

public class BlockingQueueExample {

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

        new Thread(producer).start();  //開(kāi)啟生產(chǎn)者線(xiàn)程
        new Thread(consumer).start();  //開(kāi)啟消費(fèi)者線(xiàn)程

        Thread.sleep(4000);
    }
}

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

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();
        }
    }
}

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

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秒打印一次,因?yàn)槠渲?code>take()方法在隊(duì)列內(nèi)沒(méi)有元素可以取到的時(shí)候,會(huì)阻塞當(dāng)前的消費(fèi)者線(xiàn)程,讓其處于等待狀態(tài),這個(gè)方法我們?cè)谏弦还?jié)介紹BlockingQueue的時(shí)候就已經(jīng)進(jìn)行過(guò)說(shuō)明。

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

相關(guān)文章

  • Mybatis中TypeHandler使用小結(jié)

    Mybatis中TypeHandler使用小結(jié)

    MyBatis的TypeHandler是一個(gè)強(qiáng)大的機(jī)制,它為我們提供了一種靈活的方式來(lái)處理Java類(lèi)型與數(shù)據(jù)庫(kù)類(lèi)型之間的轉(zhuǎn)換,本文主要介紹了Mybatis中TypeHandler使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • 在java程序中使用protobuf

    在java程序中使用protobuf

    這篇文章主要介紹了protobuf的基本使用和同java結(jié)合的具體案例,感性興趣的小伙伴可以一起來(lái)閱讀下文
    2021-08-08
  • Java實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼

    Java實(shí)現(xiàn)抽獎(jiǎng)算法的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)抽獎(jiǎng)算法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-04-04
  • Spring MVC 圖片的上傳和下載功能

    Spring MVC 圖片的上傳和下載功能

    SSM 框架是一種基于Java的Web開(kāi)發(fā)框架,其中Spring作為控制層、SpringMVC作為視圖層、MyBatis作為持久層,這個(gè)框架非常適合Web應(yīng)用程序的開(kāi)發(fā),這篇文章主要介紹了Spring MVC 圖片的上傳和下載功能,需要的朋友可以參考下
    2023-03-03
  • java8中l(wèi)amba表達(dá)式的使用

    java8中l(wèi)amba表達(dá)式的使用

    這篇文章主要介紹了java8中l(wèi)amba表達(dá)式的使用,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • 淺析SpringBoot多數(shù)據(jù)源實(shí)現(xiàn)方案

    淺析SpringBoot多數(shù)據(jù)源實(shí)現(xiàn)方案

    現(xiàn)在很多項(xiàng)目的開(kāi)發(fā)過(guò)程中,可能涉及到多個(gè)數(shù)據(jù)源,像讀寫(xiě)分離的場(chǎng)景,或者因?yàn)闃I(yè)務(wù)復(fù)雜,導(dǎo)致不同的業(yè)務(wù)部署在不同的數(shù)據(jù)庫(kù)上,那么這樣的場(chǎng)景,我們應(yīng)該如何在代碼中簡(jiǎn)潔方便的切換數(shù)據(jù)源呢,本文介紹SpringBoot多數(shù)據(jù)源實(shí)現(xiàn)方案,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • hibernate-validator如何使用校驗(yàn)框架

    hibernate-validator如何使用校驗(yàn)框架

    高效、合理的使用hibernate-validator校驗(yàn)框架可以提高程序的可讀性,以及減少不必要的代碼邏輯,本文主要介紹了hibernate-validator如何使用校驗(yàn)框架,感興趣的可以了解一下
    2022-04-04
  • 詳解JAVA流程控制語(yǔ)句

    詳解JAVA流程控制語(yǔ)句

    這篇文章主要介紹了Java中的流程控制語(yǔ)句,循環(huán)等語(yǔ)句是Java編程中流程控制的基礎(chǔ),需要的朋友可以參考下
    2017-04-04
  • SpringBoot AOP使用筆記

    SpringBoot AOP使用筆記

    今天小編就為大家分享一篇關(guān)于SpringBoot AOP使用筆記,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java使用二分法進(jìn)行查找和排序的示例

    Java使用二分法進(jìn)行查找和排序的示例

    這篇文章主要介紹了Java使用二分法進(jìn)行查找和排序的示例,二分插入排序和二分查找是基礎(chǔ)的算法,需要的朋友可以參考下
    2016-04-04

最新評(píng)論