JDK的執行緒池和工作機制

2021-10-02 21:46:56 字數 4195 閱讀 7398

在jdk中,所有預定義的執行緒池都是繼承自父類threadpoolexecutor

其構造方法如下:

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

各個引數的含義:int corepoolsize:執行緒池中核心執行緒數,如果小於corepoolsize就會建立新執行緒,如果等於corepoolsize,這個任務就會儲存到blockingqueue,如果呼叫prestartallcorethreads()方法就會一次性的啟動corepoolsize個數的執行緒。

int maximumpoolsize:允許的最大執行緒數,blockingqueue也滿了,且執行中線程數小於maximumpoolsize時,就會再次建立新的執行緒

long keepalivetime:執行緒空閒下來後,存活的時間,這個引數只在大於corepoolsize才有用

timeunit unit:存活時間的單位值

blockingqueueworkqueue:儲存任務的阻塞佇列

threadfactory threadfactory:建立執行緒的工廠,給新建的執行緒賦予名字

rejectedexecutionhandler handler:飽和策略(共有4個)

實現自己的飽和策略,實現rejectedexecutionhandler介面即可

execute(runnable command) 不需要返回

public void execute(runnable command) 

if (isrunning(c) && workqueue.offer(command))

else if (!addworker(command, false))

reject(command);

}

futuresubmit(callabletask) 需要返回

public futuresubmit(callabletask)
submit()方法最終還是呼叫execute()方法

shutdownnow():設定執行緒池的狀態,還會嘗試停止正在執行或者暫停任務的執行緒

shutdown():設定執行緒池的狀態,只會中斷所有沒有執行任務的執行緒

建立固定執行緒數量的,適用於負載較重的伺服器,使用了無界佇列

建立單個執行緒,需要順序保證執行任務,不會有多個執行緒活動,使用了無界佇列

會根據需要來建立新執行緒的,執行很多短期非同步任務的程式,使用了synchronousqueue

基於forkjoinpool實現

需要定期執行週期任務,timer不建議使用了。

方法說明:

定義公共類:

public class threadpoolclient 

@override

public void run() catch (interruptedexception e) }}

static class callworker implements callable

@override

public string call() throws exception }}

public static void main(string args) throws executionexception, interruptedexception 

for (int i = 0; i < 6; i++)

pool.shutdown();

}

輸出結果:

pool-1-thread-1 process the task : worker_0

pool-1-thread-2 process the task : worker_1

pool-1-thread-2 process the task : worker_2

pool-1-thread-2 process the task : worker_3

pool-1-thread-1 process the task : worker_4

pool-1-thread-2 process the task : worker_5

pool-1-thread-2 process the task : callworker_0

pool-1-thread-2:325

pool-1-thread-2 process the task : callworker_1

pool-1-thread-2:110

pool-1-thread-2 process the task : callworker_2

pool-1-thread-2:145

pool-1-thread-2 process the task : callworker_3

pool-1-thread-2:385

pool-1-thread-2 process the task : callworker_4

pool-1-thread-2:115

pool-1-thread-2 process the task : callworker_5

pool-1-thread-2:185

根據輸出結果可以看出,由於只設定了2個執行緒了,所以一直只有2個threadid在執行任務

public static void main(string args) throws executionexception, interruptedexception 

for(int i=0;i<6;i++)

pool.shutdown();

}

輸出結果:

pool-1-thread-1 process the task : worker_0

pool-1-thread-4 process the task : worker_3

pool-1-thread-3 process the task : worker_2

pool-1-thread-2 process the task : worker_1

pool-1-thread-6 process the task : worker_5

pool-1-thread-5 process the task : worker_4

pool-1-thread-7 process the task : callworker_0

pool-1-thread-7:25

pool-1-thread-8 process the task : callworker_1

pool-1-thread-8:275

pool-1-thread-8 process the task : callworker_2

pool-1-thread-8:250

pool-1-thread-8 process the task : callworker_3

pool-1-thread-8:445

pool-1-thread-8 process the task : callworker_4

pool-1-thread-8:295

pool-1-thread-8 process the task : callworker_5

pool-1-thread-8:485

可以看出,每次都是使用新建的執行緒來執行任務。

執行緒池工作機制

執行緒池 在介面效能時,尤其注重了執行緒池的使用。不建議使用executors,原因在於它裡面的很多方法預設使用的都是無界的linkedblockingqueue,高併發情況下,無界佇列很容易導致oom,而oom會導致所有請求都無法處理,這是災難性問題。因此建議使用threadpoolexecuto...

JDK執行緒池和Spring執行緒池的使用

jd 程池和spring執行緒池例項,非同步呼叫,可以直接使用 1 jd 程池的使用,此處採用單例的方式提供,見示例 public class threadpoolutil public static executorservice getexecutorservice 在其它地方可以直接這樣使用 ...

JDK 執行緒池

在jdk的4種執行緒池之前,先介紹一下執行緒池的幾個引數 固定執行緒池數量,核心執行緒數 最大執行緒數 任務佇列 linkedblockingqueue integer.max value 無界佇列 適用於同時處理固定任務數的場景.public static executorservice newf...