Java筆記-Thread Pool 線程池

1祈争、線程池作用

線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量,且復(fù)用以前工作線程角寸。根據(jù)當(dāng)前的環(huán)境菩混,手動(dòng)配置線程池,減少對(duì)系統(tǒng)資源的浪費(fèi)和擁擠扁藕。用線程池控制線程數(shù)量沮峡,同時(shí)運(yùn)行X個(gè)core線程,其他線程排隊(duì)等候亿柑。一個(gè)工作任務(wù)執(zhí)行完畢之后邢疙,從隊(duì)列前面取一個(gè)再執(zhí)行。若隊(duì)列中沒(méi)有等待線程望薄,線程池資源處于等待狀態(tài)疟游。

2、使用線程池的好處

線程池可根據(jù)系統(tǒng)的承受能力痕支,調(diào)整線程池中工作線程的數(shù)目颁虐,防止OOM或者應(yīng)用卡死。(控制線程數(shù)量卧须,防止消耗完所有的內(nèi)存)如果不使用線程池另绩,線程將會(huì)無(wú)法統(tǒng)一管理,而且每次都在new 新的對(duì)象花嘶,不會(huì)復(fù)用以前new的工作線程笋籽。(減少創(chuàng)建銷毀線程所花的時(shí)間以及系統(tǒng)資源的開(kāi)銷)

3、Java自帶的4種線程池

SingleThreadExecutor

單線程化的Executor察绷,它只會(huì)用唯一的工作線程來(lái)執(zhí)行任務(wù)干签,保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。最大特點(diǎn)是可以保證按照順序執(zhí)行各個(gè)任務(wù)拆撼,不會(huì)有多個(gè)線程是可活動(dòng)的容劳。

ScheduledThreadPool

定長(zhǎng)線程池喘沿,可控制線程最大并發(fā)數(shù),支持定時(shí)及周期性任務(wù)執(zhí)行竭贩,類似于Timer蚜印。

FixedThreadPool

定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù)留量,超出的線程會(huì)在隊(duì)列中等待窄赋。

CachedThreadPool

可緩存的線程池÷ハǎ可創(chuàng)建的最大線程數(shù)量沒(méi)有限制忆绰,如果長(zhǎng)時(shí)間(60秒)沒(méi)有向線程池中提交新任務(wù),該線程會(huì)被終止可岂。

AsyncTask

AsyncTask也是使用線程池來(lái)控制的错敢,是用ThreadPollExecutor,core線程數(shù)量是5缕粹,線程池最大值是128稚茅,也就是說(shuō)最多5個(gè)線程同時(shí)在執(zhí)行,最多128個(gè)任務(wù)在隊(duì)列中排隊(duì)等待平斩。

Timer和ScheduledExecutorService的比較

Timer在執(zhí)行定時(shí)任務(wù)時(shí)只會(huì)創(chuàng)建一個(gè)線程亚享,如果存在多個(gè)任務(wù),任務(wù)耗時(shí)時(shí)間過(guò)長(zhǎng)绘面,會(huì)發(fā)生兩個(gè)任務(wù)執(zhí)行間隔不準(zhǔn)確的情況欺税。ScheduledExecutorService內(nèi)部是線程池,不會(huì)因?yàn)槿蝿?wù)耗時(shí)過(guò)長(zhǎng)而讓其時(shí)間的間隔不正確揭璃。兩個(gè)任務(wù)線程互相不會(huì)干擾魄衅。Timer在執(zhí)行定時(shí)任務(wù)時(shí)候依賴與系統(tǒng)的時(shí)間,比如系統(tǒng)時(shí)間人為的去改變了塘辅,執(zhí)行結(jié)果也會(huì)發(fā)生改變。ScheduledExecutorService是基于時(shí)間的延時(shí)皆撩,不會(huì)依賴與系統(tǒng)時(shí)間改變的扣墩。綜上所述使用ScheduledExecutorService代替Timer比較好。

下面是分享個(gè)自己封裝的一個(gè)線程池管理工具

/**
 * @Description: java 線程池使用工具
 * @suthor GuoXC
 * @date 2016/12/06 11:29
 */
public class ThreadManager {
    private ExecutorService cachedThreadService;//可緩存線程池
    private ExecutorService fixedThreadService;//定長(zhǎng)線程池
    private ScheduledExecutorService scheduledThreadService;//定長(zhǎng)線程池
    private ExecutorService singleThreadExecutor;//單線程線程池
    private static ThreadManager manager;

    private ThreadManager() {
    }

    /**
     * 單例
     *
     * @return ThreadManager
     */
    public synchronized static ThreadManager getInstance() {
        if (manager == null) { // 解決效率問(wèn)題
            synchronized (ThreadManager.class) {
                if (manager == null) {
                    manager = new ThreadManager();
                }
            }
        }
        return manager;
    }

    /**
     * 1,可緩存線程池扛吞,如果線程池長(zhǎng)度超過(guò)處理需要呻惕,可靈活回收空閑線程,若無(wú)可回收滥比,則新建線程亚脆。
     *
     * @param runnable 線程任務(wù)
     */
    public void cachedThread(Runnable runnable) {
        if (runnable == null) return;
        if (cachedThreadService == null) {
            cachedThreadService = Executors.newCachedThreadPool();
        }
        if (!cachedThreadService.isShutdown() || !cachedThreadService.isTerminated()) {
            cachedThreadService.execute(runnable);
        } else {
            throw new RuntimeException("CachedThreadService is shut down or terminated");
        }
    }

    /**
     * 2,定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù)盲泛,超出的線程會(huì)在隊(duì)列中等待濒持。
     *
     * @param runnable 線程任務(wù)
     */
    public void fixedThread(Runnable runnable) {
        if (runnable == null) return;
        if (fixedThreadService == null) {
            fixedThreadService = Executors.newFixedThreadPool(3);
        }
        if (!fixedThreadService.isTerminated() || !fixedThreadService.isTerminated()) {
            fixedThreadService.execute(runnable);
        } else {
            throw new RuntimeException("FixedThreadService is shut down or terminated");
        }
    }

    /**
     * 3.1,定長(zhǎng)線程池键耕,延遲執(zhí)行
     *
     * @param runnable 線程任務(wù)
     * @param delay    延遲 單位 S
     */
    public void scheduledThread(Runnable runnable, long delay) {
        if (runnable == null) return;
        if (scheduledThreadService == null) {
            scheduledThreadService = Executors.newScheduledThreadPool(5);
        }
        if (!scheduledThreadService.isTerminated() || !scheduledThreadService.isShutdown()) {
            scheduledThreadService.schedule(runnable, delay, TimeUnit.SECONDS);
        } else {
            throw new RuntimeException("ScheduledThreadService is shut down or terminated");
        }
    }

    /**
     * 3.2,定長(zhǎng)線程池,定期執(zhí)行,可以用來(lái)做定時(shí)器
     *
     * @param runnable 線程任務(wù)
     * @param delay    延遲 單位 S
     * @param space    執(zhí)行間隔 單位 S
     */
    public void scheduledThread(Runnable runnable, long delay, long space) {
        if (runnable == null) return;
        if (scheduledThreadService == null) {
            scheduledThreadService = Executors.newScheduledThreadPool(2);
        }
        if (!scheduledThreadService.isShutdown() || !scheduledThreadService.isTerminated()) {
            scheduledThreadService.scheduleAtFixedRate(runnable, delay, space, TimeUnit.SECONDS);
        } else {
            throw new RuntimeException("ScheduledThreadService is shut down or terminated");
        }
    }

    /**
     * 4,單線程化的線程池柑营,它只會(huì)用唯一的工作線程來(lái)執(zhí)行任務(wù)屈雄,保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。
     *
     * @param runnable 線程任務(wù)
     */
    public void singleThread(Runnable runnable) {
        if (runnable == null) return;
        if (singleThreadExecutor == null) {
            singleThreadExecutor = Executors.newSingleThreadExecutor();
        }
        if (!singleThreadExecutor.isShutdown() || !singleThreadExecutor.isTerminated()) {
            singleThreadExecutor.execute(runnable);
        } else {
            throw new RuntimeException("SingleThreadExecutor is shut down or terminated");
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末官套,一起剝皮案震驚了整個(gè)濱河市酒奶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奶赔,老刑警劉巖惋嚎,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異站刑,居然都是意外死亡另伍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門笛钝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)质况,“玉大人,你說(shuō)我怎么就攤上這事玻靡〗衢” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵囤捻,是天一觀的道長(zhǎng)臼朗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蝎土,這世上最難降的妖魔是什么视哑? 我笑而不...
    開(kāi)封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮誊涯,結(jié)果婚禮上挡毅,老公的妹妹穿的比我還像新娘。我一直安慰自己暴构,他們只是感情好跪呈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著取逾,像睡著了一般耗绿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砾隅,一...
    開(kāi)封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天误阻,我揣著相機(jī)與錄音,去河邊找鬼。 笑死究反,一個(gè)胖子當(dāng)著我的面吹牛鹏往,可吹牛的內(nèi)容都是我干的榕茧。 我是一名探鬼主播狐胎,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼同木,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了黍氮?” 一聲冷哼從身側(cè)響起唐含,我...
    開(kāi)封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沫浆,沒(méi)想到半個(gè)月后捷枯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡专执,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年淮捆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片本股。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡攀痊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拄显,到底是詐尸還是另有隱情苟径,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布躬审,位于F島的核電站棘街,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏承边。R本人自食惡果不足惜遭殉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望博助。 院中可真熱鬧险污,春花似錦、人聲如沸富岳。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)城瞎。三九已至,卻和暖如春疾瓮,著一層夾襖步出監(jiān)牢的瞬間脖镀,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜒灰,地道東北人弦蹂。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像强窖,于是被迫代替她去往敵國(guó)和親凸椿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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