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