線程池的基本應(yīng)用總結(jié)

此為我簡(jiǎn)書的第一篇文章尿招,不是原創(chuàng)。以后盡量會(huì)的阱驾。
PS:次為在http://blog.csdn.net/u010687392/article/details/49850803 看到的文章泊业,想自己打下,加深下自己的記憶啊易。

Java內(nèi)置只為我們提供了五種常用的線程池 下面是五個(gè)的代碼實(shí)現(xiàn)的小 demo

固定線程數(shù)量的線程池#


    / * 固定線程數(shù)量的線程池 1.先執(zhí)行3個(gè)(最大的并發(fā)數(shù)量是3個(gè)) 
     * 將7個(gè)放到線程池中的消息隊(duì)列中
     */
    private static void FixThreadPool() {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
        for (int i = 1; i <= 10; i++) {
            final int index = i;
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    String threadName = Thread.currentThread().getName();
                    System.out.println("線程:" + threadName + ",正在執(zhí)行第" + index + "個(gè)任務(wù)");

                    try {
                        Thread.sleep(2000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

一共建立了數(shù)量為3的線程池,支持最大的并發(fā)數(shù)量是3饮睬。模擬了10個(gè)任務(wù)讓他處理租谈。執(zhí)行的情況是首先先執(zhí)行3個(gè)任務(wù),后面的7個(gè)任務(wù)一次進(jìn)入任務(wù)隊(duì)列中進(jìn)行等待捆愁,在執(zhí)行完這3個(gè)后割去,在通過FIFO(先進(jìn)先出的原則)從任務(wù)隊(duì)列中取出并開始執(zhí)行新的任務(wù),知道最后的任務(wù)執(zhí)行完畢昼丑。
作用:該方法返回一個(gè)固定線程數(shù)量的線程池呻逆,該線程池中的線程數(shù)量始終不變,即不會(huì)再創(chuàng)建新的線程菩帝,也不會(huì)銷毀已經(jīng)創(chuàng)建好的線程咖城,自始自終都是那幾個(gè)固定的線程在工作,所以該線程池可以控制線程的最大并發(fā)數(shù)呼奢。
栗子:假如有一個(gè)新任務(wù)提交時(shí)宜雀,線程池中如果有空閑的線程則立即使用空閑線程來處理任務(wù),如果沒有握础,則會(huì)把這個(gè)新任務(wù)存在一個(gè)任務(wù)隊(duì)列中辐董,一旦有線程空閑了,則按FIFO方式處理任務(wù)隊(duì)列中的任務(wù)

只有一個(gè)線程的線程池#

     
    /* 創(chuàng)建只有一個(gè)線程的線程池禀综,
    * 每次只執(zhí)行一個(gè)線程任務(wù)
    * 多余的任務(wù)會(huì)保存到一個(gè)任務(wù)棧中简烘,
    * 等待線程處理完后再依次任務(wù)隊(duì)列中的任務(wù)
    */
   private static void NewSingleThreadPool() {
       ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
       for (int i = 1; i <= 10; i++) {
           final int index = i;
           singleThreadPool.execute(new Runnable() {
               @Override
               public void run() {
                   String threadName = Thread.currentThread().getName();
                   System.out.println("線程:"+threadName+",正在執(zhí)行第" + index + "個(gè)任務(wù)");
                   try {
                       Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
           });
       }
   }

每次都會(huì)復(fù)用次一個(gè)線程進(jìn)行執(zhí)行任務(wù)棧中的任務(wù),效果為依次執(zhí)行定枷。
其實(shí)我們通過newSingleThreadExecutor()和newFixedThreadPool()的方法發(fā)現(xiàn)孤澎,創(chuàng)建一個(gè)singleThreadExecutorPool實(shí)際上就是創(chuàng)建一個(gè)核心線程數(shù)和最大線程數(shù)都為1的fixedThreadPool。
作用:該方法返回一個(gè)只有一個(gè)線程的線程池依鸥,即每次只能執(zhí)行一個(gè)線程任務(wù)亥至,多余的任務(wù)會(huì)保存到一個(gè)任務(wù)隊(duì)列中,等待這一個(gè)線程空閑,當(dāng)這個(gè)線程空閑了再按FIFO方式順序執(zhí)行任務(wù)隊(duì)列中的任務(wù)姐扮。

根據(jù)實(shí)際情況 而調(diào)整線程池中線程數(shù)量#

       /**
     * 一個(gè)根據(jù)實(shí)際情況調(diào)整線程池?cái)?shù)量的線程池
     */
    private static void NewCahceThreadPool() {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 1; i <= 10; i++) {
            final int index = i;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            cachedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    String threadName = Thread.currentThread().getName();
                    System.out.println("線程:" + threadName + ",正在執(zhí)行第" + index + "個(gè)任務(wù)");
                    try {
                        long time = index * 500;
                        Thread.sleep(time);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

當(dāng)有線程空閑的情況下絮供,用此線程進(jìn)行執(zhí)行任務(wù),否則創(chuàng)建新線程執(zhí)行任務(wù)茶敏。
**該方法返回一個(gè)可以根據(jù)實(shí)際情況調(diào)整線程池中線程的數(shù)量的線程池壤靶。即該線程池中的線程數(shù)量不確定,是根據(jù)實(shí)際情況動(dòng)態(tài)調(diào)整的惊搏。
栗子:假如該線程池中的所有線程都正在工作贮乳,而此時(shí)有新任務(wù)提交,那么將會(huì)創(chuàng)建新的線程去處理該任務(wù)恬惯,而此時(shí)假如之前有一些線程完成了任務(wù)向拆,現(xiàn)在又有新任務(wù)提交,那么將不會(huì)創(chuàng)建新線程去處理酪耳,而是復(fù)用空閑的線程去處理新任務(wù)浓恳。那么此時(shí)有人有疑問了,那這樣來說該線程池的線程豈不是會(huì)越集越多碗暗?其實(shí)并不會(huì)颈将,因?yàn)榫€程池中的線程都有一個(gè)“保持活動(dòng)時(shí)間”的參數(shù),通過配置它言疗,如果線程池中的空閑線程的空閑時(shí)間超過該“保存活動(dòng)時(shí)間”則立刻停止該線程晴圾,而該線程池默認(rèn)的“保持活動(dòng)時(shí)間”為60s。 也就是說如果該線程在60s之內(nèi)沒有動(dòng)作噪奄,則進(jìn)行銷毀死姚。 **

可以定時(shí)或者周期性執(zhí)行任務(wù)的線程池#

    /**
     * 一個(gè)可以定時(shí)或者周期性執(zhí)行任務(wù)的線程池
     */
    private static void NewScheDuledThreadPool() {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
        // 延遲2秒后執(zhí)行該任務(wù)
        scheduledThreadPool.schedule(new Runnable() {
            @Override
            public void run() {

            }
        }, 2, TimeUnit.SECONDS);
        // 延遲1秒后,每隔2秒執(zhí)行一次該任務(wù)
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {

            }
        }, 1, 2, TimeUnit.SECONDS);
    }

作用:該方法返回一個(gè)可以控制線程池內(nèi)線程定時(shí)或周期性執(zhí)行某任務(wù)的線程池梗醇。

可以定時(shí)或者周期性執(zhí)行任務(wù)的線程池知允,該線程池的線程數(shù)為1#

    /**
     * 創(chuàng)建一個(gè)可以定時(shí)或者周期性執(zhí)行任務(wù)的線程池,該線程池的線程數(shù)為1
     */
    private static void newSingleTheadSchedled() {
        ScheduledExecutorService singleThreadScheduledPool = Executors.newSingleThreadScheduledExecutor();
        // 延遲1秒后叙谨,每隔2秒執(zhí)行一次該任務(wù)
        singleThreadScheduledPool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                String threadName = Thread.currentThread().getName();
                System.out.println("線程:" + threadName + ",正在執(zhí)行");
            }
        }, 1, 2, TimeUnit.SECONDS);
    }

這個(gè)和上面的不同的地方就是這個(gè)線程池中的線程數(shù)量是1

下面是自定義的線程池

Java內(nèi)置只為我們提供了五種常用的線程池温鸽,一般來說這足夠用了,不過有時(shí)候我們也可以根據(jù)需求來自定義我們自己的線程池手负,而要自定義不同功能的線程池涤垫,上面我們也說了線程池功能的不同歸根到底還是內(nèi)部的BlockingQueue實(shí)現(xiàn)不同,所以竟终,我們要實(shí)現(xiàn)我們自己相要的線程池蝠猬,就必須從BlockingQueue的實(shí)現(xiàn)上做手腳,而上面也說了BlockingQueue的實(shí)現(xiàn)類有多個(gè)统捶,那么這次我們就選用PriorityBlockingQueue來實(shí)現(xiàn)一個(gè)功能是按任務(wù)的優(yōu)先級(jí)來處理的線程池 鏈接

擴(kuò)展線程池

要想擴(kuò)展線程池的話 就要重寫 三個(gè)方法

beforeExecute() - 任務(wù)執(zhí)行前執(zhí)行的方法

afterExecute() -任務(wù)執(zhí)行結(jié)束后執(zhí)行的方法

terminated() -線程池關(guān)閉后執(zhí)行的方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榆芦,一起剝皮案震驚了整個(gè)濱河市柄粹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匆绣,老刑警劉巖驻右,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異崎淳,居然都是意外死亡堪夭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門拣凹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來森爽,“玉大人,你說我怎么就攤上這事嚣镜∨莱伲” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵菊匿,是天一觀的道長(zhǎng)雕旨。 經(jīng)常有香客問我,道長(zhǎng)捧请,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任棒搜,我火速辦了婚禮疹蛉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘力麸。我一直安慰自己可款,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布克蚂。 她就那樣靜靜地躺著闺鲸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埃叭。 梳的紋絲不亂的頭發(fā)上摸恍,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音赤屋,去河邊找鬼立镶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛类早,可吹牛的內(nèi)容都是我干的媚媒。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼涩僻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缭召!你這毒婦竟也來了栈顷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤嵌巷,失蹤者是張志新(化名)和其女友劉穎萄凤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晴竞,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛙卤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了噩死。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颤难。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖已维,靈堂內(nèi)的尸體忽然破棺而出行嗤,到底是詐尸還是另有隱情,我是刑警寧澤垛耳,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布栅屏,位于F島的核電站,受9級(jí)特大地震影響堂鲜,放射性物質(zhì)發(fā)生泄漏栈雳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一缔莲、第九天 我趴在偏房一處隱蔽的房頂上張望哥纫。 院中可真熱鬧,春花似錦痴奏、人聲如沸蛀骇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擅憔。三九已至,卻和暖如春檐晕,著一層夾襖步出監(jiān)牢的瞬間暑诸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工辟灰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屠列,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓伞矩,卻偏偏與公主長(zhǎng)得像笛洛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乃坤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

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