Java中的執行緒池

2021-08-19 22:44:20 字數 3287 閱讀 8235

降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。

提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。

提高執行緒的可管理性。使用執行緒池可以進行統一分配、調優和監控。

判斷工作佇列是否已經滿

判斷執行緒池的執行緒是否已滿

總結:執行緒池的主要流程圖

如果當前執行的執行緒少於corepoolsize(預熱階段),則建立新執行緒來執行任務(注意,執行這一步驟需要獲取全域性鎖)。

如果執行的執行緒等於或多於corepoolsize,則將任務加入blockingqueue。

如果無法將任務加入blockingqueue(佇列已滿),則建立新的執行緒來處理任務(注意,執行這一步驟需要獲取全域性鎖)。

如果建立新執行緒將使當前執行的執行緒超出maximumpoolsize,任務將被拒絕,並呼叫rejectedexecutionhandler.rejectedexecution()方法。

工作執行緒:執行緒池建立執行緒時,會將執行緒封裝成工作執行緒worker,worker在執行完任務後,還會迴圈獲取工作佇列裡的任務來執行。

執行緒池中線程執行任務的情況及示意圖

在execute()方法中建立乙個執行緒時,會讓這個執行緒執行當前任務。

這個執行緒執行完上圖中1的任務後,會反覆從blockingqueue獲取任務來執行。

threadpoolexecutor類的構造方法

threadpoolexecutor

(int corepoolsize,

int maximumpoolsize,

long keepalivetime, timeunit unit, blockingqueue

workqueue)

threadpoolexecutor

(int corepoolsize,

int maximumpoolsize,

long keepalivetime, timeunit unit, blockingqueue

workqueue, rejectedexecutionhandler handler)

引數

corepoolsize(執行緒池的基本大小):當提交乙個任務到執行緒池時,執行緒池會建立乙個執行緒來執行任務,即使其他空閒的基本執行緒能夠執行新任務也會建立執行緒,等到需要執行的任務數大於執行緒池基本大小時就不再建立。

runnabletaskqueue(任務佇列):用於儲存等待執行的任務的阻塞佇列。

maximumpoolsize(執行緒池最大數量):執行緒池允許建立的最大執行緒數。

threadfactory:用於設定建立執行緒的工廠,可以通過執行緒工廠給每個建立出來的執行緒設定更有意義的名字。

rejectedexecutionhandler(飽和策略):當佇列和執行緒池都滿了,說明執行緒池處於飽和狀態,那麼必須採取一種策略處理提交的新任務。

也可以根據應用場景需要來實現rejectedexecutionhandler介面自定義策略。

其他主要引數

keepalivetime(執行緒活動保持時間):執行緒池的工作執行緒空閒後,保持存活的時間。

timeunit(執行緒活動保持時間的單位):可選的單位有天(days)、小時(hours)、分鐘(minutes)、毫秒(milliseconds)、微秒(microseconds,千分之一毫秒)和納秒(nanoseconds,千分之一微秒)。

1.executor.execute(runnable command)

功能:用於提交不需要返回值的任務,所以無法判斷任務是否被執行緒池執行成功。

例項

threadspool.

execute

(new

runnable()});

2.executorservice.submit()submit()方法語法

future

submit

(callable

task)

future

submit

(runnable task, t result)

future<

?>

submit

(runnable task)

功能:submit()方法用於提交需要返回值的任務。

示例**

future

future = executor.

submit

(harreturnvaluetask)

;try

catch

(interruptedexception e)

catch

(executionexception e)

finally

關閉執行緒池的方法:呼叫執行緒池(executorservice介面)的shutdown()或shutdownnow()

原理:遍歷執行緒池中的工作執行緒,然後逐個呼叫執行緒的interrupt方法來中斷執行緒,所以無法響應中斷的任務可能永遠無法終止。

shutdown() & shutdownnow() 的區別

其他方法

boolean

isshutdown

():只要呼叫了這兩個關閉方法中的任意乙個,該方法就會返回true。

boolean

isterminated

():當所有的任務都已關閉後,才表示執行緒池關閉成功,這時該方法才會返回true。

java執行緒系列 java5中的執行緒池

public class threadpoolstest threadpools.shutdown 停掉執行緒池 定時器,隔10s後執行 executors.newscheduledthreadpool 3 schedule new runnable 10,timeunit.seconds 定時器,...

Java執行緒池

executors類詳解 此包中所定義的 executor executorservice scheduledexecutorservice threadfactory 和 callable 類的工廠和實用方法。此類支援以下各種方法 建立並返回設定有常用配置字串的 executorservice 的...

Java執行緒池

一 執行緒池 單執行緒 public static void runsinglethreadpool public static void runsinglethreadpoolwithfactory private static class mythreadfactory implements t...