1. 程式人生 > >執行緒池佇列

執行緒池佇列

ArrayBlockingQueue:基於陣列的FIFO佇列,是有界的,建立時必須指定大小
LinkedBlockingQueue: 基於連結串列的FIFO佇列,是無界的,預設大小是 Integer.MAX_VALUE
synchronousQueue:一個比較特殊的佇列,雖然它是無界的,但它不會儲存任務,每一個新增任務的執行緒必須等待另一個執行緒取出任務,也可以把它看成容量為0的佇列

 排隊有三種通用策略:

直接提交。工作佇列的預設選項是 SynchronousQueue,它將任務直接提交給執行緒而不保持它們。在 此,如果不存在可用於立即執行任務的執行緒,則試圖把任務加入佇列將失敗,因此會構造一個新的執行緒。此策略可以避免在處理可能具有內部依賴性的請求集時出現 鎖。直接提交通常要求無界 maximumPoolSizes 以避免拒絕新提交的任務。當命令以超過佇列所能處理的平均數連續到達時,此策略允許無界線 程具有增長的可能性。

無界佇列。使用無界佇列(例如,不具有預定義容量的 LinkedBlockingQueue)將導致在所 有 corePoolSize 執行緒都忙時新任務在佇列中等待。這樣,建立的執行緒就不會超過 corePoolSize。(因 此,maximumPoolSize 的值也就無效了。)當每個任務完全獨立於其他任務,即任務執行互不影響時,適合於使用無界佇列;例如, 在 Web 頁伺服器中。這種排隊可用於處理瞬態突發請求,當命令以超過佇列所能處理的平均數連續到達時,此策略允許無界執行緒具有增長的可能性。

有界佇列。當使用有限的 maximumPoolSizes 時,有界佇列 (如 ArrayBlockingQueue)有助於防止資源耗盡,但是可能較難調整和控制。佇列大小和最大池大小可能需要相互折衷:使用大型佇列和小型 池可以最大限度地降低 CPU 使用率、作業系統資源和上下文切換開銷,但是可能導致人工降低吞吐量。如果任務頻繁阻塞(例如,如果它們是 I/O 邊 界),則系統可能為超過您許可的更多執行緒安排時間。使用小型佇列通常要求較大的池大小,CPU 使用率較高,但是可能遇到不可接受的排程開銷,這樣也會降 低吞吐量。