package com.csw.shuanfa.utils;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolUtil {
/**
* 【線程池】
* 使用線程池的10個坑_threadpool nullpointer-CSDN博客 https://blog.csdn.net/weiwenhou/article/details/126358283
*
* //建議在方法里面調(diào)用getExecutorServiceCPU方法
* ExecutorService threadPool = ThreadPoolUtil.getExecutorServiceCPU();
* List<CompletableFuture> completableFutureList = new ArrayList<>();
*
* try {
* CompletableFuture<Void> step1 = CompletableFuture.runAsync(() -> {
* }, threadPool);
* completableFutureList.add(future1);
*
* //批量阻塞完成
* // CompletableFuture.allOf(futureList.toArray(futureList.toArray(new CompletableFuture[0]))).get(1, TimeUnit.SECONDS);
* //CompletableFuture.allOf(future1, future2, future3, future4, future5, future6, future7).get(1, TimeUnit.SECONDS);
*
* } catch (Exception e) {
* System.out.println(ThreadPoolUtil.getThreadPoolName());
* threadPool.shutdownNow();
* throw new RuntimeException(e);
* } finally {
* threadPool.shutdown();
* }
*/
/**
* 在方法里面調(diào)用推薦
* AbortPolicy-拒絕并拋出異常
*/
public static ExecutorService getExecutorServiceCPU() {
return getExecutorServiceCPU(false, 0, new ThreadPoolExecutor.AbortPolicy());
}
/**
* @param type true是偏向IO處理連接
*/
public static ExecutorService getExecutorServiceCPU(boolean type) {
return getExecutorServiceCPU(type, 0, new ThreadPoolExecutor.AbortPolicy());
}
/**
* @param queneSize 隊(duì)列大小
*/
public static ExecutorService getExecutorServiceCPU(int queneSize) {
return getExecutorServiceCPU(false, queneSize, new ThreadPoolExecutor.AbortPolicy());
}
/**
* @param queneSize 隊(duì)列大小
* <p>
* 拒絕策略
* AbortPolicy-拒絕并拋出異常
* CallerRunsPolicy-回調(diào)等待不拋出異常
* DiscardPolicy-丟棄新任務(wù)不拋棄異常
* DiscardOldestPolicy-丟棄老任務(wù)不拋棄異常
* <p>
* 有隊(duì)列長度才指定決絕策略
*/
public static ExecutorService getExecutorServiceCPU(int queneSize, RejectedExecutionHandler handler) {
return getExecutorServiceCPU(false, queneSize, handler);
}
/**
* @param type true是偏向IO處理連接
* @param queneSize 隊(duì)列大小
*/
public static ExecutorService getExecutorServiceCPU(boolean type, int queneSize) {
return getExecutorServiceCPU(type, queneSize, new ThreadPoolExecutor.AbortPolicy());
}
/**
* @param type true是偏向IO處理連接
* @param queneSize 隊(duì)列大小
* <p>
* 拒絕策略
* AbortPolicy-拒絕并拋出異常
* CallerRunsPolicy-回調(diào)等待不拋出異常
* DiscardPolicy-丟棄新任務(wù)不拋棄異常
* DiscardOldestPolicy-丟棄老任務(wù)不拋棄異常
* <p>
* 有隊(duì)列長度才指定決絕策略
*
* 在一個數(shù)據(jù)處理應(yīng)用中何之,線程池的核心線程數(shù)為 5夫晌,最大線程數(shù)為 10败砂,任務(wù)隊(duì)列大小為 20掷豺。當(dāng)已經(jīng)有 5 個任務(wù)在核心線程中執(zhí)行,20 個任務(wù)在任務(wù)隊(duì)列中等待赎瑰,并且又有新任務(wù)提交時王悍,就會創(chuàng)建新的非核心線程(最多到 10 個線程)來處理這些新任務(wù)破镰。
* 當(dāng)隊(duì)列滿了才會用最大線程數(shù)
*/
public static ExecutorService getExecutorServiceCPU(boolean type, int queneSize, RejectedExecutionHandler handler) {
int cpuCounts = Runtime.getRuntime().availableProcessors();
if (cpuCounts <= 8) {
cpuCounts = 8;
}
if (queneSize == 0) {
queneSize = Integer.MAX_VALUE;
}
int poolsize = 0;
if (type == true) {//偏向IO處理連接
poolsize = cpuCounts * 2 - 1;
} else {//cpu型任務(wù)任務(wù)運(yùn)行時間快餐曼,像單線程處理
poolsize = cpuCounts - 1;
}
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat(getThreadPoolNameMethod() + "-%d").build();
ExecutorService threadPool = new ThreadPoolExecutor(poolsize, poolsize * 2, 60L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(queneSize), namedThreadFactory, handler);
return threadPool;
}
/**
* 獲取線程池名稱
*
* @return
*/
public static String getThreadPoolNameMethod() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
int j = 0;
//設(shè)置沒有出現(xiàn)過
boolean flag = false;
for (int i = 0; i < stackTrace.length; i++) {
StackTraceElement element = stackTrace[i];
//stackTrace[1]是當(dāng)前方法
if (element.getFileName().equals(stackTrace[1].getFileName())) {
flag = true;
} else {
if (flag == true) {//一旦不相等,并且之前出現(xiàn)過flag=true鲜漩,就是調(diào)用出
j = i;
break;
}
}
}
StackTraceElement element = Thread.currentThread().getStackTrace()[j];
String threadPoolName = element.getMethodName() + "_" + element.getFileName();
return threadPoolName;
}
}
線程池創(chuàng)建工具
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門理卑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔽氨,你說我怎么就攤上這事藐唠。” “怎么了鹉究?”我有些...
- 文/不壞的土叔 我叫張陵宇立,是天一觀的道長。 經(jīng)常有香客問我自赔,道長妈嘹,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任绍妨,我火速辦了婚禮蟋滴,結(jié)果婚禮上染厅,老公的妹妹穿的比我還像新娘。我一直安慰自己津函,他們只是感情好肖粮,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尔苦,像睡著了一般涩馆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允坚,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拗胜!你這毒婦竟也來了蔗候?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬榮一對情侶失蹤埂软,失蹤者是張志新(化名)和其女友劉穎锈遥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勘畔,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡所灸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炫七。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爬立。...
- 正文 年R本政府宣布陵霉,位于F島的核電站,受9級特大地震影響伍绳,放射性物質(zhì)發(fā)生泄漏踊挠。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望效床。 院中可真熱鬧睹酌,春花似錦、人聲如沸剩檀。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽沪猴。三九已至辐啄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間运嗜,已是汗流浹背壶辜。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長得像奋救,于是被迫代替她去往敵國和親岭参。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- Executors為Executor菠镇,ExecutorService冗荸,ScheduledExecutorServi...
- 寫上前面的話: 從maven進(jìn)行切換到gradle確實(shí)需要一定的轉(zhuǎn)化成本,但gradle的簡潔性和可以使用編程腳本...
- VMware InstallBuilder Enterprise是mac上一款跨平臺安裝程序創(chuàng)建工具盔粹,適用于諸多操...
- 歡迎觀看 Luminar Neo 中文版教程,小編帶大家學(xué)習(xí) Luminar Neo 的基本工具和使用技巧进萄,了解如...
- 代碼如下: 在項(xiàng)目中的應(yīng)用: 早計(jì)劃,早準(zhǔn)備援雇,早完成矛渴。 歡迎關(guān)注!交流惫搏!Star具温! GitHub:https://...