筆記-ExecutorService 和 CompletionService

先創(chuàng)建一個task

static class TestTask implements Callable<String>{
        int i;

        TestTask(int i){
            this.i = i;
        }


        @Override
        public String call() throws Exception {
            int time = new Random().nextInt(5000);
            try {

                Thread.sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "任務(wù):" + i + " finished:" + " " + time;
        }
    }

接著創(chuàng)建2測試方法:


private static void executorServiceTest(){
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        List<FutureTask> tasks = new ArrayList<>();
        for(int i =0; i<10; i++){
            FutureTask f = new FutureTask(new TestTask(i));
            tasks.add(f);
        }

        tasks.forEach(task -> {
            executorService.submit(task);
        });

        tasks.forEach(task ->{
            try {
                System.out.println(task.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        });
    }

運行結(jié)果:
任務(wù):0 finished: 38
任務(wù):1 finished: 2563
任務(wù):2 finished: 3255
任務(wù):3 finished: 4034
任務(wù):4 finished: 2158
任務(wù):5 finished: 4504
任務(wù):6 finished: 2598
任務(wù):7 finished: 3072
任務(wù):8 finished: 4668
任務(wù):9 finished: 2695

private static void completionServiceTest() {
        ExecutorService threadPool1 = Executors.newFixedThreadPool(10);

        CompletionService<String> completionService = new ExecutorCompletionService<String>(threadPool1);
        for(int i =0;i<10;i++) {
            completionService.submit(new TestTask(i));
        }

        for(int j=0;j<10;j++) {
            try {
                System.out.println(completionService.take().get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }

任務(wù):4 finished: 341
任務(wù):0 finished: 1222
任務(wù):2 finished: 1936
任務(wù):9 finished: 2656
任務(wù):6 finished: 3042
任務(wù):1 finished: 3088
任務(wù):8 finished: 3608
任務(wù):3 finished: 3999
任務(wù):5 finished: 4361
任務(wù):7 finished: 4789

結(jié)論:
這兩者最主要的區(qū)別在于submit的task不一定是按照加入自己維護的list順序完成的。
從list中遍歷的每個Future對象并不一定處于完成狀態(tài)曲横,這時調(diào)用get()方法就會被阻塞住
喂柒,如果系統(tǒng)是設(shè)計成每個線程完成后就能根據(jù)其結(jié)果繼續(xù)做后面的事,
這樣對于處于list后面的但是先完成的線程就會增加了額外的等待時間禾嫉。
而CompletionService的實現(xiàn)是維護一個保存Future對象的BlockingQueue灾杰。只有當(dāng)這個Future對象狀態(tài)是結(jié)束的時候,
才會加入到這個Queue中熙参,take()方法其實就是Producer-Consumer中的Consumer艳吠。它會從Queue中取出Future對象,
如果Queue是空的尊惰,就會阻塞在那里讲竿,直到有完成的Future對象加入到Queue中。

所以弄屡,先完成的必定先被取出题禀。這樣就減少了不必要的等待時間

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膀捷,隨后出現(xiàn)的幾起案子迈嘹,更是在濱河造成了極大的恐慌,老刑警劉巖全庸,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秀仲,死亡現(xiàn)場離奇詭異,居然都是意外死亡壶笼,警方通過查閱死者的電腦和手機神僵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來覆劈,“玉大人保礼,你說我怎么就攤上這事≡鹩铮” “怎么了炮障?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坤候。 經(jīng)常有香客問我胁赢,道長,這世上最難降的妖魔是什么白筹? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任智末,我火速辦了婚禮谅摄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吹害。我一直安慰自己螟凭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布它呀。 她就那樣靜靜地躺著螺男,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纵穿。 梳的紋絲不亂的頭發(fā)上下隧,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音谓媒,去河邊找鬼淆院。 笑死,一個胖子當(dāng)著我的面吹牛句惯,可吹牛的內(nèi)容都是我干的土辩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼抢野,長吁一口氣:“原來是場噩夢啊……” “哼拷淘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起指孤,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤启涯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恃轩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體结洼,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年叉跛,在試婚紗的時候發(fā)現(xiàn)自己被綠了松忍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡筷厘,死狀恐怖挽铁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敞掘,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布楣铁,位于F島的核電站玖雁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盖腕。R本人自食惡果不足惜赫冬,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一浓镜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劲厌,春花似錦膛薛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至风范,卻和暖如春咨跌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硼婿。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工锌半, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寇漫。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓刊殉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親州胳。 傳聞我的和親對象是個殘疾皇子记焊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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

  • 504b 0304 1400 0008 0800 fa8c 963d 50740baa dffc 0e00 6cd...
    BossOx閱讀 3,435評論 0 0
  • 6270 a1da b5e7 b8aa 4d60 60c6 dea2 9fcc66b3 1acd 0596 77b...
    BossOx閱讀 8,946評論 0 0
  • 504b 0304 1400 0008 0800 4498 963d a6fa9ff3 9f41 1e00 a88...
    BossOx閱讀 11,300評論 0 0
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)、焦點陋葡、注意力亚亲、語言聯(lián)想、情景聯(lián)想 觀點: 1.統(tǒng)計學(xué)現(xiàn)在叫數(shù)據(jù)分析腐缤,社會...
    Jenaral閱讀 5,721評論 0 5
  • 昨天捌归,在回家的路上,坐在車里悠哉悠哉地看著三毛的《撒哈拉沙漠的故事》岭粤,我被里面的內(nèi)容深深吸引住了惜索,盡管上學(xué)時...
    夜闌曉語閱讀 3,788評論 2 9