BlockingQueue介面和執行緒池

2022-08-19 15:57:10 字數 1589 閱讀 5878

它有四套api,add/remove操作失敗會直接丟擲異常,offer/poll操作失敗會返回特殊值,還可以加時間,過了時間返回失敗,put/take操作失敗會阻塞。

arrayblockingqueue:是陣列實現的,必須構造時傳入大小,傳入後不可改變。

delayqueue:實現delay介面,與排序有關,它是乙個可以實現排序的佇列,內部就是堆

linkedblockingqueue:可以指定大小也可以不指定,內部實現是鍊錶

priorityblockingqueue:是有優先順序的佇列,允許插入元素為null,所有其中物件必須實現comparable介面。

synchronousqueue:內部僅容納乙個元素,當乙個執行緒放入元素後就會被阻塞,直到這個元素被消費,又稱為同步佇列

threadpoolexecutor的7個構造引數:

核心執行緒數量:如果執行執行緒數少於這個值直接建立新執行緒,即使執行緒池中線程是空閒的

最大執行緒數:當大於核心執行緒少於最大執行緒時,只有當阻塞佇列滿了才會建立新執行緒,當核心執行緒數和最大執行緒數相同的時候,執行緒池大小是固定的,新任務提交會把它放在阻塞佇列中等待。

阻塞佇列:有三種模式,第一就是使用synchronousqueue,它會把任務直接切換到執行態,當為無界佇列(linked)時最大執行緒數這個引數就會失效,還有有界佇列(array)。如果為有界佇列,那麼佇列容量、核心執行緒數、最大執行緒數三個引數可以好好調節,如果要降低cpu消耗可以設定大佇列小執行緒池,提公升cpu使用率要設定小佇列大執行緒池,執行緒池大小也不能太大,否則效率反而會變小

時間單位

執行緒工廠:預設所有執行緒都有相同的優先順序

executors可以建立的執行緒池:返回值都是executorservice,它沒有查詢功能。

newcachedthreadpool,乙個可以動態大小的執行緒池,可以靈活**或新建

newfixedthreadpool,乙個固定大小的執行緒池,可以控制線程的最大併發數,超出的放入佇列等待。

newscheduledthreadpool:乙個定長的執行緒池,支援定時和週期任務執行,它呼叫schedule可以設定延時一段時間後執行,還可以以指定速率執行任務,指定的延時間隔執行任務

newsinglethreadexecutor:乙個單執行緒的執行緒池,保證任務序列

執行緒池提交:execute和submit,後者可以結合future得到執行緒計算結果

執行緒池關閉:shutdown和shutdownnow,後者不會等待任務執行完

執行緒池查詢:可以得到任務總數(包括已經執行的)、已完成的任務數量、當前執行緒數量、正在執行任務的執行緒數量。

running:能處理新任務,也可以處理阻塞佇列中的任務

shutdown:不能接受新任務,但是可以處理阻塞佇列中的任務,呼叫shutdown方法可以到該狀態。

stop:不能接受新任務,也不處理阻塞佇列中的任務,呼叫shutdownnow會進入該狀態

tidying:所有任務都完成了進入該狀態

terminated:從tidying轉變過來的最終狀態

執行緒數量:cpu密集型要盡量壓榨cpu,設定為cpu數+1,而io密集型要設定為2倍的cpu數量

適合用執行緒池的任務:大任務。如果任務執行的速度和執行緒池管理的速度相當,反而會降低程式執行速度。

BlockingQueue 介面詳解

array blocking queue 是基於陣列的阻塞佇列實現,在 arrayblockingqueue 內部,維護乙個定長陣列,以便快取佇列中的資料物件,內部沒有實現讀寫分離,也就意味著生產者和消費者不能完全並行,長度是需要定義的,可以指定先進先出,或者先進後出,也叫有界佇列 linked b...

阻塞佇列BlockingQueue介面 類似食品櫃

linkedblockingqueue 由鍊錶結構組成的有界 大小預設為integer.max value 阻塞佇列 21億多可看成無界。synchronousqueue 不儲存元素的blockingqueue,也即單個元素的佇列。總結 不做api呼叫工程師,要理解它的工作原理!blockingqu...

阻塞佇列BlockingQueue

例介紹乙個特殊的佇列 blockingqueue,如果blockingqueue是空的,從blockingqueue取東西的操作將會被阻斷進入等待狀態,直到blockingqueue進了東西才會被喚醒,同樣,如果blockingqueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到b...