執行緒池
1.工具類實作
/**
* @title: ThreadUtil
* @Author bao
* @description
* @Date: 2021/12/2216:07
*/
public class ThreadUtil {
private static volatile ExecutorService executorService;
?
//獲取單例物件
public static ExecutorService getInstance(){
if (executorService == null) {
synchronized (ThreadPoolManager.class) {
if (executorService == null) {
int cpuNum = Runtime.getRuntime().availableProcessors();// 獲取處理器數量
int threadNum = cpuNum * 2;// 根據cpu數量,計算出合理的執行緒并發數
executorService = Executors.newFixedThreadPool(threadNum);
}
}
}
return executorService;
}
?
?
//ceshi
public static void main(String[] args) {
ExecutorService instance = ThreadUtil.getInstance();
long taskCount = 0;
for (int i = 0; i < 100; i++) {
int j = i;
ThreadUtil.getInstance().execute(()->{
System.out.println(j);
});
?
taskCount = ((ThreadPoolExecutor)instance).getActiveCount();
System.out.println("taskCount:"+taskCount);
}
}
?
}
執行緒池監控:
long activeCount = ((ThreadPoolExecutor)instance).getActiveCount();
-
taskCount 任務的數量
-
completedTaskCount 運行的程序中完成的任務數量
-
largestPoolSize 曾經創建過的最大的執行緒數量
-
getPoolSize 執行緒數量
-
getActiveCount 獲取活動的執行緒數
-
擴展執行緒池:beforeExecute、afterExecute 在執行緒執行前,執行后做點什么
自定義執行緒池
工具類
/**
* @title: ThreadUtil
* @Author bao
* @description
* @Date: 2021/12/2215:39
*/
public class ThreadManager {
?
public static volatile ThreadPool instance;
?
?
// 獲取單例的執行緒池物件
public static ThreadPool getInstance() {
if (instance == null) {
synchronized (ThreadPoolManager.class) {
if (instance == null) {
int cpuNum = Runtime.getRuntime().availableProcessors();// 獲取處理器數量
int threadNum = cpuNum * 2;// 根據cpu數量,計算出合理的執行緒并發數
instance = new ThreadPool(threadNum, threadNum+1, Integer.MAX_VALUE);
}
}
}
return instance;
}
?
public static class ThreadPool {
private ThreadPoolExecutor mExecutor;
private int corePoolSize;
private int maximumPoolSize;
private long keepAliveTime;
?
private ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.keepAliveTime = keepAliveTime;
}
?
public void execute(Runnable runnable) {
if (runnable == null) {
return;
}
if (mExecutor == null) {
mExecutor = new ThreadPoolExecutor(corePoolSize,// 核心執行緒數
maximumPoolSize, // 最大執行緒數
keepAliveTime, // 閑置執行緒存活時間
TimeUnit.MILLISECONDS,// 時間單位
new LinkedBlockingDeque<Runnable>(Integer.MAX_VALUE),// 執行緒佇列
Executors.defaultThreadFactory(),// 執行緒工廠
new ThreadPoolExecutor.AbortPolicy() {// 佇列已滿,而且當前執行緒數已經超過最大執行緒數時的例外處理策略
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
super.rejectedExecution(r, e);
}
}
);
}
mExecutor.execute(runnable);
}
}
?
?
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
int j = i;
ThreadManager.getInstance().execute(()->{
System.out.println(j);