執行緒池是一種併發框架。
優勢:
1.降低資源消耗。(重複利用執行緒,減少開銷)
2.提高響應速度。(任務到達可直接執行,不需要等待建立執行緒)
3.提高執行緒的可管理性。(統一分配、監控、調優)
threadpoolexecutor是執行緒池的核心實現類。可以通過threadpoolexecutor來建立乙個執行緒池。
執行緒池的實現是threadpoolexecutor類,因此重點描述threadpoolexecutor類的實現。
threadpoolexecutor的結構
threadpoolexecutor的構造方法
public
threadpoolexecutor(int corepoolsize,
int maximumpoolsize,
long keepalivetime,
timeunit unit,
blockingqueueworkqueue,
threadfactory threadfactory,
rejectedexecutionhandler handler)
建構函式中省略了部分判斷的**。
主要有7個引數:
corepoolsize:核心執行緒池的大小
maximumpoolsize:執行緒池的大小
keepalivetime:存活時間(超過核心數目的執行緒空閒後的存活時間)
timeunit:時間單位
blockingqueue:任務佇列(儲存等待任務的阻塞佇列)
threadfactory:建立執行緒的工廠類
rejectedexecutionhandler:飽和策略(拒絕策略)
工作過程
當提交乙個新任務時,執行緒池的工作過程:
判斷核心執行緒池(corepool)中的執行緒是否都在執行任務。如果不是,建立乙個新的執行緒執行任務。核心執行緒池已滿,進入2;
判斷任務佇列是否已滿。未滿,則將新的任務存入;滿了,進入3;
判斷執行緒池(maximumpoolsize)裡的執行緒是否都在工作。如果沒有,建立乙個新的執行緒執行任務;否則,交給飽和策略4;
根據不同的飽和策略處理這個任務。
飽和策略有4種:
執行緒池**執行緒時,對所謂的「核心執行緒」和「非核心執行緒」是一視同仁的,直到執行緒池中線程的數量等於corepoolsize引數時,**過程才會停止。
如果設定的corepoolsize引數和maximumpoolsize引數一致時,執行緒池在任何情況下都不會**空閒執行緒。keepalivetime和timeunit也就失去了意義。
可以呼叫以下方法**核心執行緒。
threadpoolexecutor.allowcorethreadtimeout(true);
執行緒池處理任務執行緒池處理任務的方法主要有兩種,execute()和submit()。
execute()
execute()方法用於提交不需要返回值的任務,runnable例項。所以無法判斷任務是否被執行緒池執行成功。
submit()
submit()方法用於提交需要返回值的任務。執行緒池會返回乙個future型別的物件,通過這個物件可以判斷任務是否執行成功。
future的get()方法會阻塞當前執行緒直到任務完成,返回結果。
submit()最終呼叫的也是execute(runnable runable),submit()只是將callable或runnable封裝成乙個futuretask物件,因為futuretask是個runnable,所以呼叫的是execute()方法。
執行緒池的關閉
執行緒池關閉的方法主要有兩種,shutdown()和shutdownnow()。
原理:遍歷執行緒池中的工作執行緒,逐個呼叫執行緒的interrupt方法來中斷執行緒,所以無法響應中斷的任務可能永遠無法停止。
區別:
shutdown()只是將執行緒池的狀態設定成shutdown狀態,然後中斷沒有在執行任務的執行緒。
shutdownnow()首先將執行緒池的狀態設定成stop,然後嘗試停止所有正在執行或暫停任務的執行緒,並返回等待執行任務的列表。
如果任務不一定要執行完,可以呼叫shutdownnow()方法。
Java執行緒池實現原理
threadpoolexecutor是jdk提供的執行緒池實現,threadpoolexector實現了execturo介面,可以自動幫助使用者建立,銷毀和保護執行緒,先來看一下最基本的使用方式 建立乙個執行緒池final executor executor new threadpoolexecut...
Java執行緒池
executors類詳解 此包中所定義的 executor executorservice scheduledexecutorservice threadfactory 和 callable 類的工廠和實用方法。此類支援以下各種方法 建立並返回設定有常用配置字串的 executorservice 的...
Java執行緒池
一 執行緒池 單執行緒 public static void runsinglethreadpool public static void runsinglethreadpoolwithfactory private static class mythreadfactory implements t...