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

java中的BlockingQueue(阻塞隊(duì)列)解析

 更新時(shí)間:2023年12月18日 08:43:44   作者:暴躁的程序猿啊  
這篇文章主要介紹了java中的BlockingQueue阻塞隊(duì)列解析,阻塞隊(duì)列是一個(gè)支持兩個(gè)附加操作的隊(duì)列,這兩個(gè)附加的操作是,在隊(duì)列為空時(shí),獲取元素的線程會(huì)等待隊(duì)列變?yōu)榉强?需要的朋友可以參考下

BlockingQueue

阻塞隊(duì)列(BlockingQueue) 是一個(gè)支持兩個(gè)附加操作的隊(duì)列。這兩個(gè)附加的操作是:在隊(duì)列為空時(shí),獲取元素的線程會(huì)等待隊(duì)列變?yōu)榉强铡?/p>

當(dāng)隊(duì)列滿時(shí),存儲(chǔ)元素的線程會(huì)等待隊(duì)列可用。阻塞隊(duì)列常用于生產(chǎn)者和消費(fèi)者的場(chǎng)景,生產(chǎn)者是往隊(duì)列里添加元素的線程,消費(fèi)者是從隊(duì)列里拿元素的線程。

阻塞隊(duì)列就是生產(chǎn)者存放元素的容器,而消費(fèi)者也只從容器里拿元素。

使用場(chǎng)景: 多線程并發(fā)處理,線程池!

隊(duì)列 FIFO先進(jìn)先出 一端寫入一端取出

寫入如果隊(duì)列滿了就必須阻塞等待 如果隊(duì)列是空的必須阻塞等待生產(chǎn)

注意:BlockingQueue 不接受null值 試圖添加一個(gè)null元素時(shí)會(huì)拋出異常

BlockingQueue 可以是限定容量的 超過給定容量時(shí)是無法添加的

JDK中七個(gè)隊(duì)列

  1. ArrayBolckingQueue(常用):基于數(shù)組的有界阻塞隊(duì)列
  2. LinkedBlockingQueue(常用):基于鏈表的有界阻塞隊(duì)列 大小默認(rèn)為 Integer最大值
  3. PriorityBlockingQueue : 一個(gè)支持優(yōu)先級(jí)排序的無界阻塞隊(duì)列。
  4. DelayQueue: 使用優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)的延遲無界阻塞隊(duì)列
  5. SynchronousQueue: 一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列。
  6. LinkedTransferQueue: 一個(gè)由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列。
  7. LinkedBlockingDeque: 一個(gè)由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列

阻塞隊(duì)列核心方法

方法類型拋出異常特殊值( 有返回值)阻塞超時(shí)
插入addofferputoffer
移除removepolltakepoll
判斷隊(duì)列首elementpeek--

ArrayBolckingQueue使用示例

演示各個(gè)API的使用

public class Test {
    public static void main(String[] args) {
        test1();
    }

第一組會(huì)拋出異常API演示 add remove element

   /**
     * 拋出異常
     */
    public static void test1(){
        //指定隊(duì)列大小
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
        //add添加成功返回true
        System.out.println(arrayBlockingQueue.add("1"));
        System.out.println(arrayBlockingQueue.add("2"));
        System.out.println(arrayBlockingQueue.add("3"));
        //查看隊(duì)首的元素是誰 1
        System.out.println(arrayBlockingQueue.element());
        //超過隊(duì)列大小 add會(huì)拋出異常  Queue full
//        System.out.println(arrayBlockingQueue.add("4"));
        //remove取出一個(gè)元素  返回取出的值   如果隊(duì)列為空  remove會(huì)拋出異常
        // NoSuchElementException
        System.out.println(arrayBlockingQueue.remove());
        System.out.println(arrayBlockingQueue.remove());
        System.out.println(arrayBlockingQueue.remove());
        System.out.println(arrayBlockingQueue.remove());
    }

在這里插入圖片描述

第二組API使用

public static void test1(){
        //隊(duì)列的大小
        ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(2);
        //offer  添加一個(gè)元素  返回一個(gè)boolean值   成功返回true失敗返回true
        System.out.println(blockingQueue.offer(1));
        System.out.println(blockingQueue.offer(2));
        System.out.println(blockingQueue.offer(3));
        System.out.println("----------------");
        //檢測(cè)隊(duì)首元素
        System.out.println(blockingQueue.peek());
        //poll  取出一個(gè)元素  返回一個(gè)元素    隊(duì)列為空時(shí) 取出null
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.peek());
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
    }

在這里插入圖片描述

第三組阻塞API使用

放不進(jìn)去了會(huì)一直阻塞直到有空位

/**
     * 等待 一直阻塞
     */
    public static void test1(){
        ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(2);
        try {
            //put添加元素 沒有返回值 滿了一直阻塞
            //隊(duì)列大小為二   第三個(gè)元素放不進(jìn)去   阻塞兩秒過后就會(huì)結(jié)束
            blockingQueue.put("1");
            blockingQueue.put("2");
            blockingQueue.put("3");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        try {
            //取出元素  空了一直阻塞  返回值取出的元素
            System.out.println(blockingQueue.take());;
            System.out.println(blockingQueue.take());
            System.out.println(blockingQueue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

在這里插入圖片描述

第四組API使用

設(shè)置阻塞時(shí)間 超過阻塞時(shí)間沒放進(jìn)去就放棄等待

 /**
     * 等待  超時(shí)阻塞
     */
    public static void test4(){
        ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(2);
        try {
            //參數(shù) 插入的數(shù)值  超時(shí)時(shí)間 和 單位
            blockingQueue.offer("1");
            blockingQueue.offer("2");
            blockingQueue.offer("3",2, TimeUnit.SECONDS);
            System.out.println("------");
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll());
            System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

在這里插入圖片描述

到此這篇關(guān)于java中的BlockingQueue(阻塞隊(duì)列)解析的文章就介紹到這了,更多相關(guān)BlockingQueue阻塞隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • jpa?onetomany?使用級(jí)連表刪除被維護(hù)表數(shù)據(jù)時(shí)的坑

    jpa?onetomany?使用級(jí)連表刪除被維護(hù)表數(shù)據(jù)時(shí)的坑

    這篇文章主要介紹了jpa?onetomany?使用級(jí)連表刪除被維護(hù)表數(shù)據(jù)時(shí)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java5種遍歷HashMap數(shù)據(jù)的寫法

    Java5種遍歷HashMap數(shù)據(jù)的寫法

    這篇文章主要介紹了Java5種遍歷HashMap數(shù)據(jù)的寫法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • java dump文件怎么生成和分析-JMAP用法詳解

    java dump文件怎么生成和分析-JMAP用法詳解

    這篇文章主要介紹了java dump文件怎么生成和分析-JMAP用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 在Java生產(chǎn)環(huán)境下進(jìn)行性能監(jiān)控與調(diào)優(yōu)的詳細(xì)過程

    在Java生產(chǎn)環(huán)境下進(jìn)行性能監(jiān)控與調(diào)優(yōu)的詳細(xì)過程

    在Java生產(chǎn)環(huán)境下進(jìn)行性能監(jiān)控與調(diào)優(yōu)是一個(gè)復(fù)雜但重要的過程,它涉及到多個(gè)方面,包括代碼分析、JVM監(jiān)控、線程管理、垃圾收集優(yōu)化、內(nèi)存管理、數(shù)據(jù)庫交互等,下面我將提供一個(gè)詳細(xì)的概述和示例代碼,需要的朋友可以參考下
    2025-02-02
  • java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式

    java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式

    這篇文章主要介紹了java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 關(guān)于Arrays.sort()使用的注意事項(xiàng)

    關(guān)于Arrays.sort()使用的注意事項(xiàng)

    這篇文章主要介紹了關(guān)于Arrays.sort()使用的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java垃圾回收之標(biāo)記清除算法詳解

    Java垃圾回收之標(biāo)記清除算法詳解

    今天小編就為大家分享一篇關(guān)于Java垃圾回收之標(biāo)記清除算法詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java開發(fā)基礎(chǔ)日期類代碼詳解

    Java開發(fā)基礎(chǔ)日期類代碼詳解

    這篇文章主要介紹了Java開發(fā)基礎(chǔ)日期類的相關(guān)內(nèi)容,代碼通過日期工具類獲取指定月份的星期與日期對(duì)應(yīng)關(guān)系,以及獲取指定月份的所有日期與星期集合等,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • Log4j按級(jí)別輸出日志到不同文件的實(shí)現(xiàn)方法

    Log4j按級(jí)別輸出日志到不同文件的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄狶og4j按級(jí)別輸出日志到不同文件的實(shí)現(xiàn)方法。
    2016-11-11
  • Java集合框架之LinkedHashSet類解讀

    Java集合框架之LinkedHashSet類解讀

    這篇文章主要介紹了Java集合框架之LinkedHashSet類解讀,LinkedHashSet是HashSet的有序版本,它跨所有元素維護(hù)一個(gè)雙向鏈接的List,當(dāng)需要維護(hù)迭代順序時(shí),就使用這個(gè)類,當(dāng)遍歷HashSet時(shí),順序是不可預(yù)測(cè)的,需要的朋友可以參考下
    2023-09-09

最新評(píng)論