線程池創(chuàng)建工具

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;
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末源譬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子孕似,更是在濱河造成了極大的恐慌踩娘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喉祭,死亡現(xiàn)場離奇詭異养渴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泛烙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門理卑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔽氨,你說我怎么就攤上這事藐唠。” “怎么了鹉究?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵宇立,是天一觀的道長。 經(jīng)常有香客問我自赔,道長妈嘹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任绍妨,我火速辦了婚禮蟋滴,結(jié)果婚禮上染厅,老公的妹妹穿的比我還像新娘。我一直安慰自己津函,他們只是感情好肖粮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尔苦,像睡著了一般涩馆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允坚,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天魂那,我揣著相機(jī)與錄音,去河邊找鬼稠项。 笑死涯雅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的展运。 我是一名探鬼主播活逆,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拗胜!你這毒婦竟也來了蔗候?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤埂软,失蹤者是張志新(化名)和其女友劉穎锈遥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勘畔,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡所灸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炫七。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爬立。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诉字,靈堂內(nèi)的尸體忽然破棺而出懦尝,到底是詐尸還是另有隱情,我是刑警寧澤壤圃,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布陵霉,位于F島的核電站,受9級特大地震影響伍绳,放射性物質(zhì)發(fā)生泄漏踊挠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望效床。 院中可真熱鬧睹酌,春花似錦、人聲如沸剩檀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪猴。三九已至辐啄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間运嗜,已是汗流浹背壶辜。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留担租,地道東北人砸民。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像奋救,于是被迫代替她去往敵國和親岭参。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容