ThreadPoolUtil工具類

package com.example.threadpool.service;

import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**

  • @program: demo-threadpool
  • @description
  • @author: tina.liu
  • @create: 2022-04-03 20:40
    **/

@Slf4j
public class ThreadPoolUtil {

public static final ThreadPoolUtil EXCUTOR = new ThreadPoolUtil();
//核心線程池的數(shù)量僚焦,同時(shí)能夠執(zhí)行的線程數(shù)量
private int corePoolSize;
//最大線程池?cái)?shù)量勤婚,表示當(dāng)緩沖隊(duì)列滿的時(shí)候能繼續(xù)容納的等待任務(wù)的數(shù)量
private int maxPoolSize;
//存活時(shí)間
private long keepAliveTime = 1;
private TimeUnit unit = TimeUnit.HOURS;
private ThreadPoolExecutor executor;

private ThreadPoolUtil() {
    //給corePoolSize賦值:當(dāng)前設(shè)備可用處理器核心數(shù)*2 + 1,能夠讓cpu的效率得到最大程度執(zhí)行(有研究論證的)
    corePoolSize = Runtime.getRuntime().availableProcessors() * 2 + 1;
    maxPoolSize = corePoolSize;
    executor = new ThreadPoolExecutor(
            //當(dāng)某個(gè)核心任務(wù)執(zhí)行完畢筐钟,會(huì)依次從緩沖隊(duì)列中取出等待任務(wù)
            corePoolSize,
            // 然后new LinkedBlockingQueue<Runnable>(),然后maximumPoolSize,但是它的數(shù)量是包含了corePoolSize的
            maxPoolSize,
            //表示的是maximumPoolSize當(dāng)中等待任務(wù)的存活時(shí)間
            keepAliveTime,
            unit,
            //緩沖隊(duì)列颁井,用于存放等待任務(wù)旅薄,Linked的先進(jìn)先出
            new LinkedBlockingQueue<Runnable>(),
            new DefaultThreadFactory(Thread.NORM_PRIORITY, "thread-pool-"),
            new ThreadPoolExecutor.AbortPolicy()
    );
    log.info("Class ThreadPoolUtil field corePoolSize ={},maxPoolSize ={} ", corePoolSize, maxPoolSize);
}

/**
 * 執(zhí)行任務(wù) 無返回值
 *
 * @param runnable
 */
public void execute(Runnable runnable) {
    if (runnable != null) {
        executor.execute(runnable);
    }
}

/**
 * 執(zhí)行任務(wù) 有返回值
 *
 * @param callable
 */
public <T> T executeReturn(Callable<T> callable) {
    try {
        return executor.submit(callable).get();
    } catch (Exception e) {
        log.error("Class ThreadPoolUtil executeReturn fail message :{}",e.getMessage());
    }
    return null;
}




/**
 * 執(zhí)行任務(wù) 有返回值
 *
 * @param callables
 */
public <T> List<Future<T>> executeReturn(List<Callable<T>> callables) {
    try {
        return executor.invokeAll(callables);
    } catch (Exception e) {
        log.error("Class ThreadPoolUtil executeReturn fail message :{}",e.getMessage());
    }
    return null;
}


/**
 * 移除任務(wù)
 *
 * @param runnable
 */
public void remove(Runnable runnable) {
    if (runnable != null) {
        executor.remove(runnable);
    }
}

private static class DefaultThreadFactory implements ThreadFactory {

    //線程池的計(jì)數(shù)
    private static final AtomicInteger poolNumber = new AtomicInteger(1);
    //線程的計(jì)數(shù)
    private final AtomicInteger threadNumber = new AtomicInteger(1);
    private final ThreadGroup group;
    private final String namePrefix;
    private final int threadPriority;

    DefaultThreadFactory(int threadPriority, String threadNamePrefix) {
        this.threadPriority = threadPriority;
        this.group = Thread.currentThread().getThreadGroup();
        this.namePrefix = threadNamePrefix + poolNumber.getAndIncrement() + "-thread-";
    }

    @Override
    public Thread newThread(@NonNull Runnable r) {
        Thread thread = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
        // 返回True該線程就是守護(hù)線程
        // 守護(hù)線程應(yīng)該永遠(yuǎn)不去訪問固有資源,如:數(shù)據(jù)庫憔四、文件等背亥。因?yàn)樗鼤?huì)在任何時(shí)候甚至在一個(gè)操作的中間發(fā)生中斷。
        if (thread.isDaemon()) {
            thread.setDaemon(false);
        }
        thread.setPriority(threadPriority);
        return thread;
    }
}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赫模,一起剝皮案震驚了整個(gè)濱河市树肃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瀑罗,老刑警劉巖胸嘴,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斩祭,居然都是意外死亡劣像,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門摧玫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耳奕,“玉大人,你說我怎么就攤上這事诬像∥萑海” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵坏挠,是天一觀的道長芍躏。 經(jīng)常有香客問我,道長降狠,這世上最難降的妖魔是什么对竣? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任庇楞,我火速辦了婚禮,結(jié)果婚禮上柏肪,老公的妹妹穿的比我還像新娘姐刁。我一直安慰自己芥牌,他們只是感情好烦味,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壁拉,像睡著了一般谬俄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弃理,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天溃论,我揣著相機(jī)與錄音,去河邊找鬼痘昌。 笑死钥勋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辆苔。 我是一名探鬼主播算灸,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驻啤!你這毒婦竟也來了菲驴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骑冗,失蹤者是張志新(化名)和其女友劉穎赊瞬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贼涩,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巧涧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遥倦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谤绳。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谊迄,靈堂內(nèi)的尸體忽然破棺而出闷供,到底是詐尸還是另有隱情,我是刑警寧澤统诺,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布歪脏,位于F島的核電站,受9級特大地震影響粮呢,放射性物質(zhì)發(fā)生泄漏婿失。R本人自食惡果不足惜钞艇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豪硅。 院中可真熱鬧哩照,春花似錦、人聲如沸懒浮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砚著。三九已至次伶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稽穆,已是汗流浹背冠王。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舌镶,地道東北人柱彻。 一個(gè)月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像餐胀,于是被迫代替她去往敵國和親哟楷。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

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