13 執行緒池常用的阻塞佇列有哪些?

2021-10-11 20:16:01 字數 1475 閱讀 5745

執行緒池內部結構

執行緒池的內部結構主要由四部分組成,如圖所示。

阻塞佇列

執行緒池中的這四個主要組成部分最值得我們關注的就是阻塞佇列了,如**所示,不同的執行緒池會選用不同的阻塞佇列。

**左側是執行緒池,右側為它們對應的阻塞佇列,你可以看到 5 種執行緒池對應了 3 種阻塞佇列,我們接下來對它們進行逐一的介紹。

linkedblockingqueue

對於 fixedthreadpool 和 singlethreadexector 而言,它們使用的阻塞佇列是容量為 integer.max_value 的 linkedblockingqueue,可以認為是無界佇列。由於 fixedthreadpool 執行緒池的執行緒數是固定的,所以沒有辦法增加特別多的執行緒來處理任務,這時就需要 linkedblockingqueue 這樣乙個沒有容量限制的阻塞佇列來存放任務。這裡需要注意,由於執行緒池的任務佇列永遠不會放滿,所以執行緒池只會建立核心執行緒數量的執行緒,所以此時的最大執行緒數對執行緒池來說沒有意義,因為並不會觸發生成多於核心執行緒數的執行緒。

synchronousqueue

第二種阻塞佇列是 synchronousqueue,對應的執行緒池是 cachedthreadpool。執行緒池 cachedthreadpool 的最大執行緒數是 integer 的最大值,可以理解為執行緒數是可以無限擴充套件的。cachedthreadpool 和上一種執行緒池 fixedthreadpool 的情況恰恰相反,fixedthreadpool 的情況是阻塞佇列的容量是無限的,而這裡 cachedthreadpool 是執行緒數可以無限擴充套件,所以 cachedthreadpool 執行緒池並不需要乙個任務佇列來儲存任務,因為一旦有任務被提交就直接**給執行緒或者建立新執行緒來執行,而不需要另外儲存它們。

我們自己建立使用 synchronousqueue 的執行緒池時,如果不希望任務被拒絕,那麼就需要注意設定最大執行緒數要盡可能大一些,以免發生任務數大於最大執行緒數時,沒辦法把任務放到佇列中也沒有足夠執行緒來執行任務的情況。

delayedworkqueue

第三種阻塞佇列是delayedworkqueue,它對應的執行緒池分別是 scheduledthreadpool 和 singlethreadscheduledexecutor,這兩種執行緒池的最大特點就是可以延遲執行任務,比如說一定時間後執行任務或是每隔一定的時間執行一次任務。delayedworkqueue 的特點是內部元素並不是按照放入的時間排序,而是會按照延遲的時間長短對任務進行排序,內部採用的是「堆」的資料結構。之所以執行緒池 scheduledthreadpool 和 singlethreadscheduledexecutor 選擇 delayedworkqueue,是因為它們本身正是基於時間執行任務的,而延遲佇列正好可以把任務按時間進行排序,方便任務的執行。

常用的執行緒池有哪些?

newfixedthreadpool 建立固定大小的執行緒池,每次提交乙個任務就建立乙個執行緒,直到執行緒達到執行緒池的最大大小 newcachedthreadpool 建立乙個可快取的執行緒池,此執行緒池不會對執行緒池大小做限制,執行緒池大小完全依賴於 作業系統 或者說 jvm 能夠建立的最大執行...

執行緒安全的佇列 阻塞佇列

queue佇列 先進先出,兩個執行緒同時操作同乙個佇列,執行緒是不安全的 blockingqueue阻塞佇列 先進先出,執行緒是安全,阻塞佇列中維護了鎖,用於進出佇列。一般阻塞佇列用於生產者和消費者模式。arrayblockingqueue 1 基於陣列的阻塞佇列。2 維護的是定長陣列,初始化的時候...

執行緒池中常用的阻塞佇列簡述

基於陣列的阻塞佇列,有界佇列,按照先進先出 fifo 的形式,初始化是必須指定capacity.看一下原始碼 第一種構造方法,指定初始容量 public arrayblockingqueue int capacity 第二種構造方法,指定初始容量和乙個標誌,true 公平鎖,false 非公平鎖 p...