1. 程式人生 > 其它 >執行緒池的基本內容(2)

執行緒池的基本內容(2)

一. 為什麼使用執行緒池?

借用《Java併發程式設計的藝術》提到的來說一下使用執行緒池的好處:

  (1)降低資源消耗。 通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。
  (2)提高響應速度。 當任務到達時,任務可以不需要的等到執行緒建立就能立即執行。
  (3)提高執行緒的可管理性。 執行緒是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一的分配,調優和監控。

二. 如何建立執行緒池?

方式一:通過 ThreadPoolExecutor 的構造方法實現, 是最原始的建立執行緒池的方式,它包含了 7 個引數(上節講到)可供設定。

方式二:通過工具類Executors建立的執行緒池。

Executors提供四種執行緒池:

  1.newFixedThreadPool:建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。

  2.newSingleThreadExecutor:建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒按先入先出的順序執行佇列中的任務。

  3.newCachedThreadPool:建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。

  4.newScheduledThreadPool:建立一個定長執行緒池,支援定時及週期性任務執行。

阿里巴巴《Java開發手冊》強制要求執行緒池不允許使用 Executors 去建立,而是通過 ThreadPoolExecutor 的方式,這樣的處理方式讓寫的人更加明確執行緒池的執行規則,規避資源耗盡的風險。

說明:Executors 返回的執行緒池物件的弊端如下:

1) FixedThreadPool 和 SingleThreadPool:允許的請求佇列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM。

2)CachedThreadPool和ScheduledThreadPool:允許的建立執行緒數量為 Integer.MAX_VALUE,可能會建立大量的執行緒,從而導致 OOM。