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

Java自帶消息隊列Queue的使用教程詳細講解

 更新時間:2023年05月12日 10:07:07   作者:Meta39  
這篇文章主要介紹了Java自帶消息隊列Queue的使用教程,Java中的queue類是隊列數(shù)據(jù)結(jié)構(gòu)管理類,在它里邊的元素可以按照添加它們的相同順序被移除,隊列通常以FIFO的方式排序各個元素,感興趣想要詳細了解可以參考下文

阻塞隊列和非阻塞隊列

非阻塞隊列

  • ConcurrentLinkedQueue

單向鏈表結(jié)構(gòu)的無界并發(fā)隊列, 非阻塞隊列,由CAS實現(xiàn)線程安全,內(nèi)部基于節(jié)點實現(xiàn)

  • ConcurrentLinkedDeque

雙向鏈表結(jié)構(gòu)的無界并發(fā)隊列, 非阻塞隊列,由CAS實現(xiàn)線程安全

  • PriorityQueue

內(nèi)部基于數(shù)組實現(xiàn),線程不安全的隊列

阻塞隊列

  • DelayQueue

一個支持延時獲取元素的無界阻塞隊列

  • LinkedTransferQueue

一個由鏈表結(jié)構(gòu)組成的無界阻塞隊列。

  • ArrayBlockingQueue

有界隊列,阻塞式,初始化時必須指定隊列大小,且不可改變;,底層由數(shù)組實現(xiàn);

  • SynchronousQueue

最多只能存儲一個元素,每一個put操作必須等待一個take操作,否則不能繼續(xù)添加元素

  • PriorityBlockingQueue

一個帶優(yōu)先級的隊列,而不是先進先出隊列。元素按優(yōu)先級順序被移除,而且它也是無界的,也就是沒有容量上限,雖然此隊列邏輯上是無界的,但是由于資源被耗盡,所以試圖執(zhí)行添加操作可能會導致 OutOfMemoryError 錯誤;

以ArrayBlockingQueue為例實現(xiàn)阻塞隊列,非阻塞隊列這里就不說了,方法都是差不多的。

拋出異常

適用場景極少。因為程序就是要穩(wěn)定的運行,盡量不要拋出異常。

private static final BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
	//拋出異常
    @Test
    public void test(){
        System.out.println(blockingQueue.add("a"));
        System.out.println(blockingQueue.add("b"));
        System.out.println(blockingQueue.add("c"));
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove()); //移除隊列當中的元素,如果有則返回移除的元素,沒有則拋出異常:java.util.NoSuchElementException。
//        System.out.println(blockingQueue.element()); //獲取隊列當中的元素,如果有則返回,沒有則拋出異常:java.util.NoSuchElementException。
//        System.out.println(blockingQueue.add("d")); //當隊列已滿時,往隊列里添加元素,則會拋出異常:Queue full。
    }

特殊值

新消息添加進隊列時,如果當前隊列已滿,則會被直接拋棄,導致消息丟失。

private static final BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
	//特殊值
    @Test
    public void test2(){
        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。
    }

阻塞

消息處理過快會一直阻塞,這個沒什么問題。但是如果消息處理過慢,則會消息大量積壓,導致cpu占用過高程序崩潰。

private static final BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
	//阻塞
    @Test
    public void test3() throws InterruptedException {
        blockingQueue.put("a");
        blockingQueue.put("b");
        blockingQueue.put("c");
//        blockingQueue.put("d"); //如果隊列已經(jīng)滿了,則一直阻塞,直到隊列有位置。
        System.out.println(blockingQueue.take());
        System.out.println(blockingQueue.take());
        System.out.println(blockingQueue.take());
//        System.out.println(blockingQueue.take()); //如果隊列沒有元素,則一直阻塞,直到隊列有元素。
    }

超時

如果隊列已滿,則在指定時間之后再次嘗試往隊列里面設(shè)置元素,設(shè)置成功返回true,失敗返回false。這相比較上面的來說會好很多,相當于有2次機會往隊列里面設(shè)置元素。移除元素也是同理。

private static final BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
	//超時
    @Test
    public void test4() throws InterruptedException {
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("b"));
        System.out.println(blockingQueue.offer("c"));
        System.out.println(blockingQueue.offer("d",3, TimeUnit.SECONDS)); //往隊列里面添加元素,如果隊列已滿,則等待指定時間再次往隊列里面設(shè)置元素,設(shè)置成功返回true,失敗返回false。
        System.out.println(blockingQueue.poll(3,TimeUnit.SECONDS)); //移除隊列里面的元素,如果隊列里面有元素,則返回元素,沒有則等待指定時間再次移除隊列里面的元素,如果有元素則返回元素,沒有則返回null
    }

總結(jié)

使用隊列時應該考慮隊列的作用是一邊積壓消息,一邊處理消息,而且要保證隊列不會造成消息大量積壓。所以我們可以讓隊列不停的進行設(shè)置元素,然后寫個定時任務,按照指定的時間,不停的消費隊列里面的全部元素。這個指定時間要根據(jù)業(yè)務量去設(shè)置,如果業(yè)務量太少,時間間隔可以設(shè)置的長一點。業(yè)務量大設(shè)置的短一點,如:1s執(zhí)行一次,一次全部取完隊列里的元素。這種情況就不建議使用固定長度的消息隊列,而應該使用自動擴容的消息隊列,因為你無法直到消息隊列的具體長度是多少。

到此這篇關(guān)于Java自帶消息隊列Queue的使用教程詳細講解的文章就介紹到這了,更多相關(guān)Java自帶消息隊列Queue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中@Configuration和@Component注解的區(qū)別及原理

    Spring中@Configuration和@Component注解的區(qū)別及原理

    這篇文章主要介紹了Spring中@Configuration和@Component注解的區(qū)別及原理,從功能上來講,這些注解所負責的功能的確不相同,但是從本質(zhì)上來講,Spring內(nèi)部都將其作為配置注解進行處理,需要的朋友可以參考下
    2023-11-11
  • java生成申請單序列號的實現(xiàn)方法

    java生成申請單序列號的實現(xiàn)方法

    申請單序列號一般要求根據(jù)一定的規(guī)則生成后幾位連續(xù)的字符串,下面是我項目中使用的生成序列號的代碼,其中用到了鎖機制,有需要的朋友可以參考一下
    2014-01-01
  • SpringDataJpa:JpaRepository增刪改查操作

    SpringDataJpa:JpaRepository增刪改查操作

    這篇文章主要介紹了SpringDataJpa:JpaRepository增刪改查操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring Data Neo4j Cypher查詢使用

    Spring Data Neo4j Cypher查詢使用

    本文介紹了Spring Data Neo4j Cypher查詢使用的幾種方法,包括使用Repository接口、動態(tài)查詢、服務層組合、外部查詢文件和圖形化查詢構(gòu)建器, 感興趣的可以了解一下
    2024-11-11
  • JAVA實現(xiàn)經(jīng)典游戲坦克大戰(zhàn)的示例代碼

    JAVA實現(xiàn)經(jīng)典游戲坦克大戰(zhàn)的示例代碼

    小時候大家都玩過坦克大戰(zhàn)吧,熟悉的旋律和豐富的關(guān)卡陪伴了我們一整個寒暑假。本文將通過Java+Swing實現(xiàn)這一經(jīng)典游戲,感興趣的可以學習一下
    2022-01-01
  • Spring Boot整合logback一個簡單的日志集成架構(gòu)

    Spring Boot整合logback一個簡單的日志集成架構(gòu)

    今天小編就為大家分享一篇關(guān)于Spring Boot整合logback一個簡單的日志集成架構(gòu),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • java非官方常用類MessageInfo消息接口示例

    java非官方常用類MessageInfo消息接口示例

    這篇文章主要為大家介紹了java非官方常用類MessageInfo消息接口使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java中如何使用Response重定向

    Java中如何使用Response重定向

    這篇文章主要介紹了Java中如何使用Response重定向,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Android 應用按返回鍵退向后臺運行實例代碼

    Android 應用按返回鍵退向后臺運行實例代碼

    這篇文章主要介紹了Android 應用按返回鍵退向后臺運行實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • jax-ws handler 的詳解及簡單實例

    jax-ws handler 的詳解及簡單實例

    這篇文章主要介紹了 jax-ws handler 的詳解及簡單實例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09

最新評論

突泉县| 兴和县| 郯城县| 互助| 柘城县| 宜宾县| 五原县| 宝鸡市| 枣强县| 亳州市| 滨州市| 九寨沟县| 德惠市| 乌苏市| 承德市| 任丘市| 灵寿县| 宁乡县| 名山县| 建德市| 榆树市| 余姚市| 沈丘县| 峨山| 绩溪县| 迁安市| 调兵山市| 乌兰察布市| 深州市| 德江县| 北安市| 保康县| 太湖县| 宣恩县| 彭山县| 原平市| 福贡县| 邹城市| 进贤县| 孟津县| 库尔勒市|