多執行緒 執行緒池

2021-10-05 17:49:20 字數 2568 閱讀 9392

執行緒池是什麼: 執行緒池(thread pool)是一種基於池化思想管理執行緒的工具,經常出現在多執行緒伺服器中,如mysql。執行緒過多會帶來額外的開銷,其中包括建立銷毀執行緒的開銷、排程執行緒的開銷等等,同時也降低了計算機的整體效能。執行緒池維護多個執行緒,等待監督管理者分配可併發執行的任務。這種做法,一方面避免了處理任務時建立銷毀執行緒開銷的代價,另一方面避免了執行緒數量膨脹導致的過分排程問題,保證了對核心的充分利用。

執行緒池帶來的好處降低資源消耗:通過池化技術重複利用已建立的執行緒,降低執行緒建立和銷毀造成的損耗

提高響應速度:任務到達時,無需等待執行緒建立即可立即執行

提高執行緒的可管理性:執行緒是稀缺資源,如果無限制建立,不僅會消耗系統資源,還會因為執行緒的不合理分布導致資源排程失衡,降低系統的穩定性。使用執行緒池可以進行統一的分配、調優和監控

執行緒池解決的問題頻繁申請/銷毀資源和排程資源,將帶來額外的消耗,可能會非常巨大

對資源無限申請缺少抑制手段,易引發系統資源耗盡的風險

系統無法合理管理內部的資源分布,會降低系統的穩定性、

幾種常見的執行緒池及使用方法threadpoolexecutor構造方法

引數介紹:

corepoolsize:執行緒池的核心池大小,執行緒池建立之後,執行緒池中的執行緒數為0,當任務過來就會建立乙個執行緒去執行,直到執行緒數達到corepoolsize,這時若依舊有任務到來時,會把任務放入等待佇列中。如果執行了執行緒池的prestartallcorethreads()方法,執行緒池會提前建立並啟動所有核心執行緒

maximumpoolsize:執行緒池所允許的最大執行緒個數。當佇列滿了,且已建立的執行緒數小於maximumpoolsize,則執行緒池會建立新的執行緒來執行任務。另外,對於無界佇列,可忽略該引數

keepalivetiem:執行緒存活保持時間)當執行緒池中線程數大於核心執行緒數時,執行緒的空閒時間如果超過執行緒存活時間,那麼這個執行緒就會被銷毀,直到執行緒池中的執行緒數小於等於核心執行緒數

workqueue(任務佇列,有預設值):用於傳輸和儲存等待執行任務的阻塞佇列

threadfactory(執行緒工廠,有預設值):用於建立新執行緒。threadfactory建立的執行緒也是採用new thread()方式,threadfactory建立的執行緒名都具有統一的風格:pool-m-thread-n(m為執行緒池的編號,n為執行緒池內的執行緒編號)

handler(執行緒飽和策略,有預設值):當執行緒池和佇列都滿了,再加入執行緒會執行此策略

threadpoolexecutor執行過程

快取執行緒池(executors.newcachedthreadpool();)快取執行緒池,快取的執行緒預設存活60秒。執行緒的核心池corepoolsize大小為0,核心池最大為integer.max_value,阻塞佇列使用的是synchronousqueue。是乙個直接提交的阻塞佇列,他總會迫使執行緒池增加新的執行緒去執行新的任務。在沒有任務執行時,當執行緒的空閒時間超過keepalivetime(60秒),則工作執行緒將會終止被**,當提交新任務時,如果沒有空閒執行緒,則建立新執行緒執行任務,會導致一定的系統開銷。如果同時又大量任務被提交,而且任務執行的時間不是特別快,那麼執行緒池便會新增出等量的執行緒池處理任務,這很可能會很快耗盡系統的資源

建立使用案例

單例執行緒池(executors.newsinglethreadexecutor();)

建立乙個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(fifo, lifo, 優先順序)執行

建立使用案例

可重用固定個數執行緒池(executors.newfixedthreadpool(int nthreads))

建立乙個可重用固定個數的執行緒池,以共享的無界佇列方式來執行這些執行緒

案例圖示

定長線程池(scheduledexecutorservice ses = executors.newscheduledthreadpool(int corepoolsize);)

建立乙個定長線程池,支援定時及週期性任務執行

案例圖示

多執行緒 執行緒池

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

多執行緒 執行緒池

執行緒池的作用 減少了每次建立 銷毀執行緒所帶來的損耗。執行緒池建立執行緒的簡易流程 文字描述 1 先判斷核心執行緒池 corepoolsize 是否已滿,沒滿就建立核心執行緒執行,滿了就進行下一判斷。2 判斷等待佇列 workqueue 是否已經滿了,沒滿就新增到等待佇列,滿了就進行下一判斷。3 ...

多執行緒 執行緒池

executors.newfixedthreadpool int 建立乙個固定執行緒數的執行緒池,其最大執行緒數跟核心執行緒數一樣大。使用linkblockingqueue.public static executorservice newfixedthreadpool int nthreads e...