Java多线程:有4个线程分别获取C、D、E、F盘的大小,第5个线程统计总大小

HERE原文

主要用到的方法是:CountDownLatch, 
CountDownLatch类是一个同步倒数计数器,构造时传入int参数,
该参数就是计数器的初始值,
每调用一次countDown()方法,计数器减1,计数器大于0 时, 
await()方法会阻塞后面程序执行,直到计数器为0,后面被阻塞的方法才会得以实行。
await(long timeout, TimeUnitunit),是等待一定时间,然后执行,
不管计数器是否到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("完成磁盘的统计任务,耗费%d秒. 磁盘大小为%d.\n", timer, diskSize);
                    diskMemory.setSize(diskSize);

                    // 任务完成之后,计数器减一
                    countDownLatch.countDown();
                    System.out.println("count num = " + countDownLatch.getCount());
                }
            });

        }
        // 主线程一直被阻塞,直到count的计数器被置为0
        countDownLatch.await();
        System.out.printf("全部磁盘都统计完成,所有磁盘总大小.\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顺序不保证)

完成磁盘的统计任务,耗费0秒. 磁盘大小为300.
count num = 3
完成磁盘的统计任务,耗费2秒. 磁盘大小为100.
count num = 2
完成磁盘的统计任务,耗费2秒. 磁盘大小为300.
count num = 1
完成磁盘的统计任务,耗费2秒. 磁盘大小为300.
count num = 0
全部磁盘都统计完成,所有磁盘总大小 = 1000

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 154,781评论 23 678
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 11,318评论 0 33
  • 2016总结 我意识到每一个人都是自己的一个镜子,而我对反感或讨厌的人或事儿,其实是我自己内心在不敢面对或者是我自...
    杨恩博阅读 87评论 0 2
  • “你的梦想是什么?”我想成为奥特曼…… 这是很多小时候喜欢奥特曼的我们,每当有人问我们都会说,为什么就不说了,...
    我与奥特曼的故事阅读 1,304评论 4 7
  • 老井的历史要追溯至太太公或再前的年代。 井水冬暖夏凉,现在周围街坊常用之洗衣洗物,所以老井仍葆青春。 1. 一一井...
    天亦阅读 111评论 3 4