Java執行緒池的實現分析

2021-08-10 07:11:35 字數 2587 閱讀 4554

執行緒池是一種併發框架。

優勢:

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...