美文网首页
Java多线程:有4个线程分别获取C、D、E、F盘的大小,第5个

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

作者: HarryXR | 来源:发表于2017-07-25 14:31 被阅读249次

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

相关文章

网友评论

      本文标题:Java多线程:有4个线程分别获取C、D、E、F盘的大小,第5个

      本文链接:https://www.haomeiwen.com/subject/vhbwkxtx.html