java知識(shí)總結(jié)-創(chuàng)建線程池的6種方式

一、創(chuàng)建線程池的6種方式:

  1. Executors.newCachedThreadPool();
    創(chuàng)建一個(gè)可緩存線程池踏施,應(yīng)用中存在的線程數(shù)可以無限大

  2. Executors.newFixedThreadPool(2)
    創(chuàng)建一個(gè)定長線程池应又,可控制線程最大并發(fā)數(shù)宙项,超出的線程會(huì)在隊(duì)列中等待。

  3. Executors.newScheduledThreadPool(2)
    創(chuàng)建一個(gè)定長線程池株扛,支持定時(shí)及周期性任務(wù)執(zhí)行尤筐。

4 Executors.newSingleThreadExecutor();
創(chuàng)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù)洞就,
保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行盆繁。

5 Executors.newSingleThreadScheduledExecutor();
創(chuàng)建一個(gè)單例線程池,定期或延時(shí)執(zhí)行任務(wù)旬蟋。

6 Executors.newWorkStealingPool(3);
創(chuàng)建一個(gè)帶并行級(jí)別的線程池油昂,并行級(jí)別決定了同一時(shí)刻最多有多少個(gè)線程在執(zhí)行,如不穿如并行級(jí)別參數(shù)倾贰,將默認(rèn)為當(dāng)前系統(tǒng)的CPU個(gè)數(shù)冕碟。

二、代碼

線程代碼

public class ThreadForpools implements Runnable {

    private Integer index;

    public ThreadForpools(Integer index) {
        this.index = index;
    }

    @Override
    public void run() {
        /***
         * 業(yè)務(wù)......省略
         */
        try {
            System.out.println(index + " 開始處理線程4艺恪0菜隆!");
            Thread.sleep(index * 2000);  //等2秒方便參觀
            System.out.println(index + " 我的線程標(biāo)識(shí)是:" + this.toString());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

方式一:newCachedThreadPool


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 描述:newCachedThreadPool
 * 創(chuàng)建一個(gè)可緩存線程池吞彤,應(yīng)用中存在的線程數(shù)可以無限大
 */
public class ThreadpoolsCached {
    public static  void main(String[]args)
    {
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        
        for(int i=0;i<10;i++)
        {
            final int index=i;
            newCachedThreadPool.execute(new ThreadForpools(index));
        }
    }

}

借助jconsole工具看看線程我衬,由下圖可看。所有的線程一次性已經(jīng)加載進(jìn)來了饰恕。
線程執(zhí)行完了挠羔,線程數(shù)也相應(yīng)減少了,最后程序也就結(jié)束了埋嵌。

2.jpg

方式二:newFixedThreadPool


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 描述:創(chuàng)建一個(gè)定長線程池破加,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待雹嗦。
 */
public class ThreadpoolsFixed {

    public static  void main(String[]args)
    {
        //線程池允許同時(shí)存在兩個(gè)線程
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);
        
        for(int i=0;i<10;i++)
        {
            final int index=i;
            newFixedThreadPool.execute(new ThreadForpools(index));
        }
    }
}

再看看jconsole的線程情況范舀。只有兩個(gè)線程合是。線程執(zhí)行完后還會(huì)處于等待的狀態(tài)。


線程

方式三:newScheduledThreadPool


import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 描述:創(chuàng)建一個(gè)定長線程池锭环,支持定時(shí)及周期性任務(wù)執(zhí)行聪全。延遲執(zhí)行示例代碼如下
 */
public class ThreadpoolsScheduled {
    /**
     * 我們獲取四次次線程,觀察4個(gè)線程地址
     * @param args
     */
    public static  void main(String[]args)
    {
        ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(2);

        for(int i=0;i<10;i++)
        {
            final int index=i;
            //延遲三秒執(zhí)行
            newScheduledThreadPool.schedule(new ThreadForpools(index),3, TimeUnit.SECONDS);
        }
    }

}

方式四:newSingleThreadExecutor


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 描述:創(chuàng)建一個(gè)單線程化的線程池辅辩,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù)难礼,
 * 保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。
 */
public class ThreadpoolsSingle {

    public static  void main(String[]args) {
        ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();

        for(int i=0;i<10;i++)
        {
            final int index=i;
            newSingleThreadExecutor.execute(new ThreadForpools(index));
        }
    }
}

方式五:newSingleThreadScheduledExecutor


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 描述:創(chuàng)建一個(gè)單例線程池玫锋,定期或延時(shí)執(zhí)行任務(wù)蛾茉。
 */
public class ThreadpoolsSingleThreadScheduled {
    /**
     * 我們獲取四次次線程,觀察4個(gè)線程地址
     * @param args
     */
    public static  void main(String[]args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();


        for(int i=0;i<10;i++)
        {
            final int index=i;
            scheduledExecutorService.schedule(new ThreadForpools(index),3, TimeUnit.SECONDS);

        }
    }

}

方式六:

···

import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**

  • 描述:創(chuàng)建一個(gè)帶并行級(jí)別的線程池撩鹿,并行級(jí)別決定了同一時(shí)刻最多有多少個(gè)線程在執(zhí)行谦炬,

  • 如不穿如并行級(jí)別參數(shù),將默認(rèn)為當(dāng)前系統(tǒng)的CPU個(gè)數(shù)节沦。
    */
    public class ThreadpoolsWorkStealingPool {
    public static void main(String[] args) throws Exception {

     // 設(shè)置并行級(jí)別為2键思,即默認(rèn)每時(shí)每刻只有2個(gè)線程同時(shí)執(zhí)行
     ExecutorService executorService = Executors.newWorkStealingPool(3);
    
     for (int i = 1; i <= 50; i++) {
         final int count=i;
         
         executorService.submit(new ThreadForpools(count));
     }
     while(true){
         //主線程陷入死循環(huán),來觀察結(jié)果散劫,否則是看不到結(jié)果的
     }
    

    }

}

···

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稚机,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子获搏,更是在濱河造成了極大的恐慌赖条,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件常熙,死亡現(xiàn)場離奇詭異纬乍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)裸卫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門仿贬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人墓贿,你說我怎么就攤上這事茧泪。” “怎么了聋袋?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵队伟,是天一觀的道長。 經(jīng)常有香客問我幽勒,道長嗜侮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮锈颗,結(jié)果婚禮上顷霹,老公的妹妹穿的比我還像新娘。我一直安慰自己击吱,他們只是感情好淋淀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姨拥,像睡著了一般绅喉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叫乌,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音徽缚,去河邊找鬼憨奸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凿试,可吹牛的內(nèi)容都是我干的排宰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼那婉,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼板甘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起详炬,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤盐类,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后呛谜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體在跳,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年隐岛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猫妙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聚凹,死狀恐怖割坠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妒牙,我是刑警寧澤彼哼,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站单旁,受9級(jí)特大地震影響沪羔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一蔫饰、第九天 我趴在偏房一處隱蔽的房頂上張望琅豆。 院中可真熱鬧,春花似錦篓吁、人聲如沸茫因。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冻押。三九已至,卻和暖如春盛嘿,著一層夾襖步出監(jiān)牢的瞬間洛巢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工次兆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稿茉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓芥炭,卻偏偏與公主長得像漓库,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子园蝠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • 序言 近日后臺(tái)需要一些數(shù)據(jù)渺蒿,需要從網(wǎng)上爬取,但是爬取的過程中彪薛,由于訪問速度太頻繁茂装,造成IP被封,最終通過線程池解決...
    HusterYP閱讀 843評(píng)論 0 3
  • 前段時(shí)間遇到這樣一個(gè)問題陪汽,有人問微信朋友圈的上傳圖片的功能怎么做才能讓用戶的等待時(shí)間較短训唱,比如說一下上傳9張圖片,...
    加油碼農(nóng)閱讀 1,204評(píng)論 0 2
  • 為什么使用線程池 當(dāng)我們?cè)谑褂镁€程時(shí),如果每次需要一個(gè)線程時(shí)都去創(chuàng)建一個(gè)線程挚冤,這樣實(shí)現(xiàn)起來很簡單况增,但是會(huì)有一個(gè)問題...
    閩越布衣閱讀 4,293評(píng)論 10 45
  • 結(jié)婚了就一切恢復(fù)了平淡,無非就是柴米油鹽训挡,這些雖然不是什么大的事情澳骤,也離不開金錢。什么戀愛時(shí)隨口就來的浪漫橋段澜薄,還...
    王明露閱讀 433評(píng)論 0 0
  • 定好五點(diǎn)的鬧鐘为肮,鬧鐘響了,而我確怎么都起不來肤京,離不開床颊艳,而離不開床意味著又得睡著茅特,舒適的被窩難以棄舍! 所以有時(shí)候...
    每日的力量閱讀 178評(píng)論 0 0