【阿里面试题】JAVA多线程统计文件夹大小

以下为多线程统计文件夹大小的工具类,经过测试,使用forkjointask能更好的发挥多核心cpu的性能,提升速度。这里使用List和for 循环代替了递归。

   * 获取文件夹大小
     * @param dir
     * @return
     */
    public static long getDirSize(String dir) {
        File folder = new File(dir);
        if(!folder.isDirectory()) {
            return folder.length();
        }
        return IoOperateHolder.forkjoinPool.invoke(new CalDirCommand(folder));
    }

    static class CalDirCommand extends RecursiveTask<Long> {
        private File folder;

        CalDirCommand(File folder){
            this.folder = folder;
        }

        @Override
        protected Long compute() {
            AtomicLong size = new AtomicLong(0);
            File[] files = folder.listFiles();
            if(files == null || files.length == 0) {
                return 0L;
            }
            List<ForkJoinTask<Long>> jobs = new ArrayList<>();
            for(File f : files) {
                if(!f.isDirectory()) {
                    size.addAndGet(f.length());
                } else {
                    jobs.add(new CalDirCommand(f));
                }
            }
            for(ForkJoinTask<Long> t : invokeAll(jobs)) {
                size.addAndGet(t.join());
            }
            return size.get();
        }
    }

    private static final class IoOperateHolder {
        final static ForkJoinPool forkjoinPool = new ForkJoinPool();
    }



    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        long result = getDirSize("/Users/sunhf");
       System.out.println("大小:"+result+"字节, 用时:"+(System.currentTimeMillis() - start)+"ms");
       //单线程 大小:263251930518
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值