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

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

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

什么是阻塞隊列

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

阻塞隊列的特點

BlockingQueue不是新的東西

學(xué)會使用隊列

阻塞隊列四組API

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

拋出異常

/**
* 拋出異常
*/
public static void test1(){
// 隊列的大小
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(){
// 隊列的大小
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 {
        // 隊列的大小
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
        // 一直阻塞
        blockingQueue.put("a");
        blockingQueue.put("b");
        blockingQueue.put("c");
        // blockingQueue.put("d"); // 隊列沒有位置了,一直阻塞
        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 {
        // 隊列的大小
        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 同步隊列

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

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

public class SynchronousQueueDemo {
    public static void main(String[] args) {
        BlockingQueue<String> blockingQueue = new SynchronousQueue<>(); // 同步隊
        // 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阻塞隊列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)案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • java編程之xpath介紹

    java編程之xpath介紹

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

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

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

    java JVM原理與常識知識點

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

    Spring Data JPA實現(xiàn)分頁Pageable的實例代碼

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

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

    這篇文章主要介紹了淺談Java如何實現(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

最新評論

德庆县| 松桃| 城口县| 辽阳市| 手游| 浑源县| 台北市| 和政县| 寿阳县| 搜索| 黔江区| 樟树市| 容城县| 得荣县| 嫩江县| 临西县| 慈利县| 霸州市| 新津县| 扎赉特旗| 达日县| 中牟县| 西乡县| 江西省| 会理县| 玛多县| 正镶白旗| 墨脱县| 肥东县| 白玉县| 库尔勒市| 防城港市| 阿拉尔市| 郧西县| 蕉岭县| 保山市| 阳高县| 北票市| 兴安盟| 依兰县| 和林格尔县|