日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池

發布時間:2025/3/21 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 概述
  • 阻塞隊列的常用場景
  • 阻塞隊列的4種處理方式
  • JDK 7提供的7個阻塞隊列
    • ArrayBlockingQueue
    • LinkedBlockingQueue
    • PriorityBlockingQueue
    • DelayQueue
    • SynchronousQueue
    • LinkedTransferQueue
    • LinkedBlockingDeque
  • 線程池

概述

阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列。這兩個附加的操作支持阻塞的插入和移除方法.

  • 支持阻塞的插入方法:意思是當隊列滿時,隊列會阻塞插入元素的線程,直到隊列不滿

  • 支持阻塞的移除方法:意思是在隊列為空時,獲取元素的線程會等待隊列變為非空


阻塞隊列的常用場景

阻塞隊列常用于生產者和消費者的場景,生產者是向隊列里添加元素的線程,消費者是從隊列里取元素的線程。阻塞隊列就是生產者用來存放元素、消費者用來獲取元素的容器。


阻塞隊列的4種處理方式

  • 拋出異常

當隊列滿時,如果再往隊列里插入元素,會拋出IllegalStateException(“Queuefull”)異常。
當隊列空時,從隊列里獲取元素會拋出NoSuchElementException異常。


  • 返回特殊值

當往隊列插入元素時,會返回元素是否插入成功,成功返回true。如果是移除方法,則是從隊列里取出一個元素,如果沒有則返回null。


  • 一直阻塞

當阻塞隊列滿時,如果生產者線程往隊列里put元素,隊列會一直阻塞生產者線程,直到隊列可用或者響應中斷退出。

當隊列空時,如果消費者線程從隊列里take元素,隊列會阻塞住消費者線程,直到隊列不為空。


  • 超時退出

當阻塞隊列滿時,如果生產者線程往隊列里插入元素,隊列會阻塞生產者線程一段時間,如果超過了指定的時間,生產者線程就會退出。

如果是無界阻塞隊列,隊列不可能會出現滿的情況,所以使用put或offer方法永遠不會被阻塞,而且使用offer方法時,該方法永遠返回true。


JDK 7提供的7個阻塞隊列

ArrayBlockingQueue

一個由數組結構組成的有界阻塞隊列.

ArrayBlockingQueue是一個用數組實現的有界阻塞隊列。此隊列按照先進先出(FIFO)的原則對元素進行排序。

默認情況下不保證線程公平的訪問隊列.

所謂公平訪問隊列是指阻塞的線程,可以按照阻塞的先后順序訪問隊列,即先阻塞線程先訪問隊列。

非公平性是對先等待的線程是非公平的,當隊列可用時,阻塞的線程都可以爭奪訪問隊列的資格,有可能先阻塞的線程最后才訪問隊列。

為了保證公平性,通常會降低吞吐量。我們可以使用以下代碼創建一個公平的阻塞隊列。

ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(1000,true);

LinkedBlockingQueue

一個由鏈表結構組成的有界阻塞隊列

LinkedBlockingQueue是一個用鏈表實現的有界阻塞隊列。此隊列的默認和最大長度為Integer.MAX_VALUE。此隊列按照先進先出的原則對元素進行排序。


PriorityBlockingQueue

一個支持優先級排序的無界阻塞隊列

默認情況下元素采取自然順序升序排列。也可以自定義類實現compareTo()方法來指定元素排序規則,或者初始化PriorityBlockingQueue時,指定構造參數Comparator來對元素進行排序。需要注意的是不能保證同優先級元素的順序。


DelayQueue

一個使用優先級隊列實現的無界阻塞隊列。

DelayQueue是一個支持延時獲取元素的無界阻塞隊列。隊列使用PriorityQueue來實現。隊列中的元素必須實現Delayed接口,在創建元素時可以指定多久才能從隊列中獲取當前元素。只有在延遲期滿時才能從隊列中提取元素。


SynchronousQueue

一個不存儲元素的阻塞隊列

SynchronousQueue是一個不存儲元素的阻塞隊列。每一個put操作必須等待一個take操作,否則不能繼續添加元素。

它支持公平訪問隊列。默認情況下線程采用非公平性策略訪問隊列。使用以下構造方法可以創建公平性訪問的SynchronousQueue,如果設置為true,則等待的線程會采用先進先出的順序訪問隊列

public SynchronousQueue(boolean fair) {transferer = fair new TransferQueue() : new TransferStack(); }

SynchronousQueue可以看成是一個傳球手,負責把生產者線程處理的數據直接傳遞給消費者線程。隊列本身并不存儲任何元素,非常適合傳遞性場景。

SynchronousQueue的吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue。


LinkedTransferQueue

一個由鏈表結構組成的無界阻塞隊列

LinkedTransferQueue是一個由鏈表結構組成的無界阻塞TransferQueue隊列。相對于其他阻塞隊列,LinkedTransferQueue多了tryTransfer和transfer方法。


LinkedBlockingDeque

一個由鏈表結構組成的雙向阻塞隊列

所謂雙向隊列指的是可以從隊列的兩端插入和移出元素。雙向隊列因為多了一個操作隊列的入口,在多線程同時入隊時,也就減少了一半的競爭。相比其他的阻塞隊列,LinkedBlockingDeque多了addFirst、addLast、offerFirst、offerLast、peekFirst和peekLast等方法,以First單詞結尾的方法,表示插入、獲取(peek)或移除雙端隊列的第一個元素。以Last單詞結尾的方法,表示插入、獲取或移除雙端隊列的最后一個元素。


線程池

很久以前總結過了,這里就不贅述了,見Java-Java中的線程池原理分析及使用

總結

以上是生活随笔為你收集整理的并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。