執行緒池筆記

2022-05-05 06:54:11 字數 1511 閱讀 9532

threadpoolexecutor:

一、主要的成員變數:

ctl: 主線程池的控制狀態,它是乙個atomic integer ,包含了兩個概念上的域,①、workercount,執行緒池中有效執行緒的數量。②、runstate,是否正在執行,關閉等狀態。

工作執行緒數量(workercount)就是workers的值(成員變數workers).這個值有可能會與真實存活的執行緒的數量是不一樣,因為這個值是瞬間變化的。比如,當threadfactory建立乙個執行緒失敗以後;或者存在的執行緒在終止之前仍然被記錄。使用者看到的池大小是當前workers的長度。

為了將這兩個值裝箱到乙個int中,我們限制它的工作執行緒在2^29之內,也就是500萬引內,而不是的integer.max_value(20億以內)。

執行狀態(runstate)提供生命週期的控制,它的值由以下幾個常量來表示:running, shutdown, stop, tidying, terminated. runstate隨著時間單調遞增,

workqueue:持有任務執行緒,並且交給工程執行緒處理。我們不要求workqueue.poll()必須返回null值來唯一的判斷佇列是否為空。

workers:池中所有的工作者執行緒。只有持有mainlock的時候才可以訪問。

largestpoolsize:用來追蹤執行緒池執行緒數量最大的時候是多少。

completedtaskcount:已經完成的任務數量。

threadfactory:用來建立新的執行緒。

keepalivetime:允許空閒執行緒等待任務的時間,單位為納秒。只有在當前執行緒數量大於核心池的數量或者允許核心池執行緒超時。其它情況的話會一直等待新的任務。

corepoolsize:核心池的大小就是保持活動狀態不允許超時的的工作者執行緒的最小值,除非設定了allowcorethreadtimeout,這種情況下最小值為0。

maximumpoolsize:核心池中的工作者執行緒的最大數量。

二、主要的方法:

addworker(runnable firsttask, boolean core):檢查新建立的工作者執行緒是否可以新增到當前狀態且已經指定界限(無論是corepoolsize還是maximumpoolsize)的執行緒池。如果是這樣的話,工作者執行緒的數量會相應的調整,可能的話就會建立新的工作者執行緒並啟動它。如果執行緒池已經停止或符合shutdown的條件的話,那麼這個方法就會返回false. 如果執行緒工廠建立執行緒失敗(不管是返回null,還是丟擲異常)也會返回false。

execute(runnable command):執行的三個步驟,①、如果是少於corepoolsize的執行緒正在執行,嘗試使用的指定的任務command去啟動乙個新的執行緒,就像它的第乙個任務一樣呼叫addworker方法,原子性的檢查執行狀態和工作執行緒數量,因此

③、如果不能成功排隊(不能將執行緒加入到佇列中),那麼就嘗試新增乙個新的工作者執行緒,如果新增失敗的話,說明這個執行緒池已經關閉或者執行緒池已經飽和所以才會拒絕這個任務。

執行緒池筆記

newsinglethreadexecutor 建立乙個工作執行緒 保證說有任務流程化執行 newfixedthreadpool 建立乙個定長的執行緒池 控制併發數量 超過指定長度在佇列中等待 newcachedthreadpool 建立乙個理論上可以無限大的執行緒池 適合時間短小的任務 cache...

執行緒池自學筆記1 執行緒池介紹

一 什麼是執行緒池 執行緒池其實就是一種多執行緒處理形式,處理過程中可以將任務新增到佇列中,然後在建立執行緒後自動啟動這些任務。二 為什麼使用執行緒池 使用執行緒池最大的原因就是可以根據系統的需求和硬體環境靈活的控制線程的數量,且可以對所有執行緒進行統一的管理和控制,從而提高系統的執行效率,降低系統...

java執行緒池筆記

那為什麼要用執行緒池 執行緒池作用就是限制系統中執行執行緒的數量。根據系統的環境情況,可以自動或手動設定執行緒數量,達到執行的最佳效果 少了浪費了系統資源,多了造成系統擁擠效率不高。用執行緒池控制線程數量,其他執行緒排隊等候。乙個任務執行完畢,再從佇列的中取最前面的任務開始執行。若佇列中沒有等待程序...