龙空技术网

Java高频面试:4个线程分别获取磁盘的大小,第5个线程统计总大小

小黄人大眼仔 68

前言:

今天看官们对“java读取大文件开多线程”大概比较关怀,大家都想要知道一些“java读取大文件开多线程”的相关资讯。那么小编在网上汇集了一些对于“java读取大文件开多线程””的相关内容,希望我们能喜欢,我们快快来了解一下吧!

前言:之前看到一个Java的面试题,最近在看《Java多线程编程核心技术》然后就试着去解决这道题,这里给出一个个人认为最简单的方法:

主要用到的方法是:CountDownLatch, CountDownLatch类是一个同步倒数计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时, await()方法会阻塞后面程序执行,直到计数器为0,后面被阻塞的方法才会得以实行。await(long timeout, TimeUnitunit),是等待一定时间,然后执行,不管计数器是否到0了。

代码很简单,main方法如下:

public 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();    }

DiskMemory类如下:

public class DiskMemory {    private int totalSize ;    public int getSize(){        return (new Random().nextInt(3)+1)*100;//加一是为了防止获取磁盘大小为0,不符合常理    }    public synchronized void setSize(int size){        totalSize += size;    }    public int getTotalSize(){        return totalSize;    }}

运行结果如下:

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

标签: #java读取大文件开多线程 #java高频词统计