線程池--完整使用示例

public class Test {
     public static void main(String[] args) {   
         ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(5));
         for(int i=0;i<15;i++){
             MyTask myTask = new MyTask(i);
             executor.execute(myTask);
             System.out.println("線程池中線程數(shù)目:"+executor.getPoolSize()+"掘宪,隊列中等待執(zhí)行的任務數(shù)目:"+
             executor.getQueue().size()+",已執(zhí)行玩別的任務數(shù)目:"+executor.getCompletedTaskCount());
         }
         executor.shutdown();
     }
}

class MyTask implements Runnable {
    private int taskNum;

    public MyTask(int num) {
        this.taskNum = num;
    }

    @Override
    public void run() {
        System.out.println("正在執(zhí)行task "+taskNum);
        try {
            Thread.currentThread().sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task "+taskNum+"執(zhí)行完畢");
    }
}

執(zhí)行結果:

正在執(zhí)行task 0
線程池中線程數(shù)目:1歇盼,隊列中等待執(zhí)行的任務數(shù)目:0舔痕,已執(zhí)行玩別的任務數(shù)目:0
線程池中線程數(shù)目:2,隊列中等待執(zhí)行的任務數(shù)目:0豹缀,已執(zhí)行玩別的任務數(shù)目:0
正在執(zhí)行task 1
線程池中線程數(shù)目:3伯复,隊列中等待執(zhí)行的任務數(shù)目:0,已執(zhí)行玩別的任務數(shù)目:0
正在執(zhí)行task 2
線程池中線程數(shù)目:4邢笙,隊列中等待執(zhí)行的任務數(shù)目:0啸如,已執(zhí)行玩別的任務數(shù)目:0
正在執(zhí)行task 3
線程池中線程數(shù)目:5,隊列中等待執(zhí)行的任務數(shù)目:0氮惯,已執(zhí)行玩別的任務數(shù)目:0
正在執(zhí)行task 4
線程池中線程數(shù)目:5叮雳,隊列中等待執(zhí)行的任務數(shù)目:1,已執(zhí)行玩別的任務數(shù)目:0
線程池中線程數(shù)目:5妇汗,隊列中等待執(zhí)行的任務數(shù)目:2帘不,已執(zhí)行玩別的任務數(shù)目:0
線程池中線程數(shù)目:5,隊列中等待執(zhí)行的任務數(shù)目:3杨箭,已執(zhí)行玩別的任務數(shù)目:0
線程池中線程數(shù)目:5厌均,隊列中等待執(zhí)行的任務數(shù)目:4,已執(zhí)行玩別的任務數(shù)目:0
線程池中線程數(shù)目:5告唆,隊列中等待執(zhí)行的任務數(shù)目:5棺弊,已執(zhí)行玩別的任務數(shù)目:0
線程池中線程數(shù)目:6,隊列中等待執(zhí)行的任務數(shù)目:5擒悬,已執(zhí)行玩別的任務數(shù)目:0
正在執(zhí)行task 10
線程池中線程數(shù)目:7模她,隊列中等待執(zhí)行的任務數(shù)目:5,已執(zhí)行玩別的任務數(shù)目:0
正在執(zhí)行task 11
線程池中線程數(shù)目:8懂牧,隊列中等待執(zhí)行的任務數(shù)目:5侈净,已執(zhí)行玩別的任務數(shù)目:0
正在執(zhí)行task 12
線程池中線程數(shù)目:9尊勿,隊列中等待執(zhí)行的任務數(shù)目:5,已執(zhí)行玩別的任務數(shù)目:0
正在執(zhí)行task 13
線程池中線程數(shù)目:10畜侦,隊列中等待執(zhí)行的任務數(shù)目:5元扔,已執(zhí)行玩別的任務數(shù)目:0
正在執(zhí)行task 14
task 3執(zhí)行完畢
task 0執(zhí)行完畢
task 2執(zhí)行完畢
task 1執(zhí)行完畢
正在執(zhí)行task 8
正在執(zhí)行task 7
正在執(zhí)行task 6
正在執(zhí)行task 5
task 4執(zhí)行完畢
task 10執(zhí)行完畢
task 11執(zhí)行完畢
task 13執(zhí)行完畢
task 12執(zhí)行完畢
正在執(zhí)行task 9
task 14執(zhí)行完畢
task 8執(zhí)行完畢
task 5執(zhí)行完畢
task 7執(zhí)行完畢
task 6執(zhí)行完畢
task 9執(zhí)行完畢

從執(zhí)行結果可以看出,當線程池中線程的數(shù)目大于5時旋膳,便將任務放入任務緩存隊列里面澎语,當任務緩存隊列滿了之后,便創(chuàng)建新的線程验懊。如果上面程序中擅羞,將for循環(huán)中改成執(zhí)行20個任務,就會拋出任務拒絕異常了义图。
不過在Java doc中减俏,并不提倡我們直接使用ThreadPoolExecutor,而是使用Executors類中提供的幾個靜態(tài)方法來創(chuàng)建線程池:

Executors.newCachedThreadPool();        //創(chuàng)建一個緩沖池碱工,緩沖池容量大小為Integer.MAX_VALUE
Executors.newSingleThreadExecutor();   //創(chuàng)建容量為1的緩沖池
Executors.newFixedThreadPool(int);    //創(chuàng)建固定容量大小的緩沖池
Executors.newScheduledThreadPool(int)   //創(chuàng)建一個固定長度的線程池娃承,而且以延遲或定時的方式來執(zhí)行任務

它們實際上也是調(diào)用了ThreadPoolExecutor,只不過參數(shù)都已配置好了怕篷。

newFixedThreadPool創(chuàng)建的線程池corePoolSize和maximumPoolSize值是相等的历筝,它使用的LinkedBlockingQueue;

newSingleThreadExecutor將corePoolSize和maximumPoolSize都設置為1匙头,也使用的LinkedBlockingQueue漫谷;

newCachedThreadPool將corePoolSize設置為0,將maximumPoolSize設置為Integer.MAX_VALUE蹂析,使用的SynchronousQueue舔示,也就是說來了任務就創(chuàng)建線程運行,當線程空閑超過60秒电抚,就銷毀線程惕稻。

實際中,如果Executors提供的四個靜態(tài)方法能滿足要求蝙叛,就盡量使用它提供的四個方法俺祠,因為自己去手動配置ThreadPoolExecutor的參數(shù)有點麻煩,要根據(jù)實際任務的類型和數(shù)量來進行配置借帘。
可以看看線程池--方便的創(chuàng)建和使用:Executors工具類

另外蜘渣,如果ThreadPoolExecutor達不到要求,可以自己繼承ThreadPoolExecutor類進行重寫肺然。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔫缸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子际起,更是在濱河造成了極大的恐慌拾碌,老刑警劉巖吐葱,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異校翔,居然都是意外死亡弟跑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門防症,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孟辑,“玉大人,你說我怎么就攤上這事告希∑私” “怎么了烧给?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵燕偶,是天一觀的道長。 經(jīng)常有香客問我础嫡,道長指么,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任榴鼎,我火速辦了婚禮伯诬,結果婚禮上,老公的妹妹穿的比我還像新娘巫财。我一直安慰自己盗似,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布平项。 她就那樣靜靜地躺著赫舒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闽瓢。 梳的紋絲不亂的頭發(fā)上接癌,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音扣讼,去河邊找鬼缺猛。 笑死,一個胖子當著我的面吹牛椭符,可吹牛的內(nèi)容都是我干的荔燎。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼销钝,長吁一口氣:“原來是場噩夢啊……” “哼有咨!你這毒婦竟也來了?” 一聲冷哼從身側響起曙搬,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤摔吏,失蹤者是張志新(化名)和其女友劉穎鸽嫂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體征讲,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡据某,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诗箍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癣籽。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滤祖,靈堂內(nèi)的尸體忽然破棺而出筷狼,到底是詐尸還是另有隱情,我是刑警寧澤匠童,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布埂材,位于F島的核電站,受9級特大地震影響汤求,放射性物質發(fā)生泄漏俏险。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一扬绪、第九天 我趴在偏房一處隱蔽的房頂上張望竖独。 院中可真熱鬧,春花似錦挤牛、人聲如沸莹痢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竞膳。三九已至,卻和暖如春竣蹦,著一層夾襖步出監(jiān)牢的瞬間顶猜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工痘括, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留长窄,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓纲菌,卻偏偏與公主長得像挠日,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翰舌,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

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