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

Java阻塞隊(duì)列BlockingQueue基礎(chǔ)與使用

 更新時間:2023年01月03日 17:22:22   作者:欲無緣  
本文詳細(xì)介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見使用場景,通過實(shí)例代碼介紹了Java 阻塞隊(duì)列BlockingQueue的相關(guān)知識,需要的朋友可以參考下

什么是阻塞隊(duì)列

阻塞隊(duì)列本質(zhì)上還是一種隊(duì)列,遵循先進(jìn)先出,后進(jìn)后出的原則,在此基礎(chǔ)上,如果出隊(duì)時阻塞隊(duì)列為空,則會使當(dāng)前線程陷入阻塞,直到入隊(duì)新元素時通知線程繼續(xù)執(zhí)行,如果入隊(duì)時阻塞隊(duì)列為滿,則會使當(dāng)前線程陷入阻塞,直到出隊(duì)舊元素時才通知線程進(jìn)行執(zhí)行。

阻塞隊(duì)列的特點(diǎn)

BlockingQueue不是新的東西

學(xué)會使用隊(duì)列

阻塞隊(duì)列四組API

方式拋出異常有返回值,不拋出異常阻塞 等待超時等待
添加add(E e)offer(E e)put()offer(E e,Time,TimeUnit)
移除remove()poll()take()poll(Time,TimeUnit)
檢測隊(duì)首元素element()peek
  • 拋出異常是指當(dāng)隊(duì)列滿時,再次插入會拋出異常(如果隊(duì)列未滿,插入返回值未true);
  • 返回布爾是指當(dāng)隊(duì)列滿時,再次插入會返回false;
  • 阻塞是指當(dāng)隊(duì)列滿時,再次插入會被阻塞,直到隊(duì)列取出一個元素,才能插入。
  • 超時是指當(dāng)一個時限過后,才會插入或者取出。

拋出異常

/**
* 拋出異常
*/
public static void test1(){
// 隊(duì)列的大小
ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.add("a"));
System.out.println(blockingQueue.add("b"));
System.out.println(blockingQueue.add("c"));
// IllegalStateException: Queue full 拋出異常!
// System.out.println(blockingQueue.add("d"));
System.out.println(blockingQueue.remove());
System.out.println(blockingQueue.remove());
System.out.println(blockingQueue.remove());
// java.util.NoSuchElementException 拋出異常!
// System.out.println(blockingQueue.remove());
}

有返回值,沒有異

/**
* 有返回值,沒有異常
*/
public static void test2(){
// 隊(duì)列的大小
ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.offer("a"));
System.out.println(blockingQueue.offer("b"));
System.out.println(blockingQueue.offer("c"));
// System.out.println(blockingQueue.offer("d")); // false 不拋出異常!
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll()); // null 不拋出異常!
}

等待,阻塞(一直阻塞)

/**
 * 等待,阻塞(一直阻塞)
 */
public static void test3() throws InterruptedException {
        // 隊(duì)列的大小
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
        // 一直阻塞
        blockingQueue.put("a");
        blockingQueue.put("b");
        blockingQueue.put("c");
        // blockingQueue.put("d"); // 隊(duì)列沒有位置了,一直阻塞
        System.out.println(blockingQueue.take());
        System.out.println(blockingQueue.take());
        System.out.println(blockingQueue.take());
        System.out.println(blockingQueue.take())
}

等待,阻塞(等待超時

/**
 * 等待,阻塞(等待超時)
 */
public static void test4() throws InterruptedException {
        // 隊(duì)列的大小
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
        blockingQueue.offer("a");
        blockingQueue.offer("b");
        blockingQueue.offer("c");
        // blockingQueue.offer("d",2,TimeUnit.SECONDS); // 等待超過2秒就退出
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());
        blockingQueue.poll(2,TimeUnit.SECONDS); 
}

SynchronousQueue 同步隊(duì)列

和其他的BlockingQueue 不一樣, SynchronousQueue 不存儲元素

put了一個元素,必須從里面先take取出來,否則不能在put進(jìn)去值!

public class SynchronousQueueDemo {
    public static void main(String[] args) {
        BlockingQueue<String> blockingQueue = new SynchronousQueue<>(); // 同步隊(duì)
        // new Thread(()->{
            try {
                System.out.println(Thread.currentThread().getName()+" put 1");
                blockingQueue.put("1");
                System.out.println(Thread.currentThread().getName()+" put 2");
                blockingQueue.put("2");
                System.out.println(Thread.currentThread().getName()+" put 3");
                blockingQueue.put("3");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"T1").start();
        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"=>"+blockingQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"T2").start();
    }
}

到此這篇關(guān)于Java阻塞隊(duì)列BlockingQueue基礎(chǔ)與使用的文章就介紹到這了,更多相關(guān)Java BlockingQueue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java之Swagger配置掃描接口以及開關(guān)案例講解

    Java之Swagger配置掃描接口以及開關(guān)案例講解

    這篇文章主要介紹了Java之Swagger配置掃描接口以及開關(guān)案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • java編程之xpath介紹

    java編程之xpath介紹

    這篇文章主要介紹了java編程之xpath介紹,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • springboot實(shí)現(xiàn)異步調(diào)用@Async的示例

    springboot實(shí)現(xiàn)異步調(diào)用@Async的示例

    這篇文章主要介紹了springboot實(shí)現(xiàn)異步調(diào)用@Async的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java JVM原理與常識知識點(diǎn)

    java JVM原理與常識知識點(diǎn)

    在本文中小編給大家分享的是關(guān)于java的JVM原理和java常識,有興趣的朋友們可以學(xué)習(xí)下
    2018-12-12
  • Spring Data JPA實(shí)現(xiàn)分頁P(yáng)ageable的實(shí)例代碼

    Spring Data JPA實(shí)現(xiàn)分頁P(yáng)ageable的實(shí)例代碼

    本篇文章主要介紹了Spring Data JPA實(shí)現(xiàn)分頁P(yáng)ageable的實(shí)例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-07-07
  • 淺談Java如何實(shí)現(xiàn)一個基于LRU時間復(fù)雜度為O(1)的緩存

    淺談Java如何實(shí)現(xiàn)一個基于LRU時間復(fù)雜度為O(1)的緩存

    這篇文章主要介紹了淺談Java如何實(shí)現(xiàn)一個基于LRU時間復(fù)雜度為O(1)的緩存,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • java使用des加密解密示例分享

    java使用des加密解密示例分享

    java使用des加密解密示例,適合java語言的所有平臺,與.net等平臺的加密解密兼容
    2014-02-02
  • springboot Controller直接返回String類型帶來的亂碼問題及解決

    springboot Controller直接返回String類型帶來的亂碼問題及解決

    文章介紹了在Spring Boot中,當(dāng)Controller直接返回String類型時可能出現(xiàn)的亂碼問題,并提供了解決辦法,通過在`application.yaml`中設(shè)置請求和響應(yīng)的編碼格式,并在自定義配置類中進(jìn)行配置,可以有效解決這一問題
    2024-11-11
  • Intellij IDEA 2019 最新亂碼問題及解決必殺技(必看篇)

    Intellij IDEA 2019 最新亂碼問題及解決必殺技(必看篇)

    大家在使用Intellij IDEA 的時候會經(jīng)常遇到各種亂碼問題,今天小編給大家分享一些關(guān)于Intellij IDEA 2019 最新亂碼問題及解決必殺技,感興趣的朋友跟隨小編一起看看吧
    2020-04-04
  • Java輸入輸出語句舉例詳解(通俗易懂!)

    Java輸入輸出語句舉例詳解(通俗易懂!)

    這篇文章主要給大家介紹了關(guān)于Java輸入輸出語句的相關(guān)資料,作為一種常用的編程語言,Java提供了多種輸入輸出的方式,用于與用戶進(jìn)行數(shù)據(jù)交互或處理文件數(shù)據(jù),需要的朋友可以參考下
    2023-10-10

最新評論

井陉县| 龙胜| 冀州市| 墨竹工卡县| 石门县| 大余县| 平陆县| 乌兰县| 会泽县| 鄢陵县| 荣昌县| 乌拉特后旗| 绥化市| 米林县| 凤冈县| 鄂尔多斯市| 遂川县| 广宗县| 彝良县| 吉水县| 玉溪市| 正安县| 凌海市| 焉耆| 和龙市| 桦南县| 通海县| 汾阳市| 铁岭县| 龙海市| 迁安市| 博野县| 奎屯市| 凌海市| 拜城县| 略阳县| 时尚| 六枝特区| 武强县| 昌邑市| 古蔺县|