Java多線程:有4個(gè)線程分別獲取C、D、E、F盤的大小,第5個(gè)線程統(tǒng)計(jì)總大小

HERE原文

主要用到的方法是:CountDownLatch, 
CountDownLatch類是一個(gè)同步倒數(shù)計(jì)數(shù)器,構(gòu)造時(shí)傳入int參數(shù),
該參數(shù)就是計(jì)數(shù)器的初始值,
每調(diào)用一次countDown()方法,計(jì)數(shù)器減1,計(jì)數(shù)器大于0 時(shí), 
await()方法會(huì)阻塞后面程序執(zhí)行,直到計(jì)數(shù)器為0,后面被阻塞的方法才會(huì)得以實(shí)行。
await(long timeout, TimeUnitunit),是等待一定時(shí)間,然后執(zhí)行,
不管計(jì)數(shù)器是否到0了。
ublic static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(4);
        ExecutorService service = Executors.newFixedThreadPool(6);
        DiskMemory diskMemory = new DiskMemory();
        for (int i = 0; i < 4; i++) {

            service.execute(new Runnable() {
                @Override
                public void run() {
                    int timer = new Random().nextInt(5);
                    try {
                        Thread.sleep(timer * 1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    int diskSize = diskMemory.getSize();
                    System.out.printf("完成磁盤的統(tǒng)計(jì)任務(wù),耗費(fèi)%d秒. 磁盤大小為%d.\n", timer, diskSize);
                    diskMemory.setSize(diskSize);

                    // 任務(wù)完成之后,計(jì)數(shù)器減一
                    countDownLatch.countDown();
                    System.out.println("count num = " + countDownLatch.getCount());
                }
            });

        }
        // 主線程一直被阻塞,直到count的計(jì)數(shù)器被置為0
        countDownLatch.await();
        System.out.printf("全部磁盤都統(tǒng)計(jì)完成,所有磁盤總大小.\n" + ", totalSize = " + diskMemory.getTotalSize());
        service.shutdown();
    }
public class DiskMemory {
    private int totalSize ;
    public int getSize(){
        return (new Random().nextInt(3)+1)*100;//加一是為了防止獲取磁盤大小為0,不符合常理
    }

    public void setSize(int size){
        totalSize += size;
    }

    public int getTotalSize(){
        return totalSize;
    }
}

輸出:(count順序不保證)

完成磁盤的統(tǒng)計(jì)任務(wù),耗費(fèi)0秒. 磁盤大小為300.
count num = 3
完成磁盤的統(tǒng)計(jì)任務(wù),耗費(fèi)2秒. 磁盤大小為100.
count num = 2
完成磁盤的統(tǒng)計(jì)任務(wù),耗費(fèi)2秒. 磁盤大小為300.
count num = 1
完成磁盤的統(tǒng)計(jì)任務(wù),耗費(fèi)2秒. 磁盤大小為300.
count num = 0
全部磁盤都統(tǒng)計(jì)完成,所有磁盤總大小 = 1000
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,381評(píng)論 25 708
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,771評(píng)論 0 33
  • 2016總結(jié) 我意識(shí)到每一個(gè)人都是自己的一個(gè)鏡子,而我對(duì)反感或討厭的人或事兒,其實(shí)是我自己內(nèi)心在不敢面對(duì)或者是我自...
    楊恩博閱讀 187評(píng)論 0 2
  • “你的夢(mèng)想是什么?”我想成為奧特曼…… 這是很多小時(shí)候喜歡奧特曼的我們,每當(dāng)有人問我們都會(huì)說(shuō),為什么就不說(shuō)了,...
    行星文明觀察者閱讀 2,242評(píng)論 4 10
  • 如需轉(zhuǎn)載,請(qǐng)注明出處,尊重他人勞動(dòng),謝謝 GCD:Grand Central Dispatch (GCD)是App...
    GoApple閱讀 314評(píng)論 0 2