(一)单线程递归方式

package com.taobao.test;

import java.io.File;

public class TotalFileSizeSequential {

    public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk";

    // 递归方式 计算文件的大小
private long getTotalSizeOfFilesInDir(final File file) {
if (file.isFile())
return file.length();
final File[] children = file.listFiles();
long total = 0;
if (children != null)
for (final File child : children)
total += getTotalSizeOfFilesInDir(child);
return total;
} public static void main(final String[] args) {
final long start = System.nanoTime(); final long total = new TotalFileSizeSequential()
.getTotalSizeOfFilesInDir(new File(fileName));
final long end = System.nanoTime();
System.out.println("Total Size: " + total);
System.out.println("Time taken: " + (end - start) / 1.0e9);
}
}

(二)使用Executors.newFixedThreadPool和callable 多线程实现

package com.taobao.test;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; public class ConcurrentTotalFileSize { public static final String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; class SubDirectoriesAndSize { final public long size;
final public List<File> subDirectories; public SubDirectoriesAndSize(final long totalSize,
final List<File> theSubDirs) {
size = totalSize;
subDirectories = Collections.unmodifiableList(theSubDirs);
}
} private SubDirectoriesAndSize getTotalAndSubDirs(final File file) {
long total = 0;
final List<File> subDirectories = new ArrayList<File>();
if (file.isDirectory()) {
final File[] children = file.listFiles();
if (children != null)
for (final File child : children) {
if (child.isFile())
total += child.length();
else
subDirectories.add(child);
}
}
return new SubDirectoriesAndSize(total, subDirectories);
} private long getTotalSizeOfFilesInDir(final File file)
throws InterruptedException, ExecutionException, TimeoutException {
final ExecutorService service = Executors.newFixedThreadPool(100);
try {
long total = 0;
final List<File> directories = new ArrayList<File>();
directories.add(file);
while (!directories.isEmpty()) {
final List<Future<SubDirectoriesAndSize>> partialResults = new ArrayList<Future<SubDirectoriesAndSize>>();
for (final File directory : directories) {
partialResults.add(service
.submit(new Callable<SubDirectoriesAndSize>() {
public SubDirectoriesAndSize call() {
return getTotalAndSubDirs(directory);
}
}));
}
directories.clear();
for (final Future<SubDirectoriesAndSize> partialResultFuture : partialResults) {
final SubDirectoriesAndSize subDirectoriesAndSize = partialResultFuture
.get(100, TimeUnit.SECONDS);
directories.addAll(subDirectoriesAndSize.subDirectories);
total += subDirectoriesAndSize.size;
}
}
return total;
} finally {
service.shutdown();
}
} public static void main(final String[] args) throws InterruptedException,
ExecutionException, TimeoutException {
final long start = System.nanoTime();
final long total = new ConcurrentTotalFileSize()
.getTotalSizeOfFilesInDir(new File(fileName));
final long end = System.nanoTime();
System.out.println("Total Size: " + total);
System.out.println("Time taken: " + (end - start) / 1.0e9);
}
}

(三)使用Executors.newFixedThreadPool和callable 多线程的另外一种实现

package com.taobao.test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; public class NaivelyConcurrentTotalFileSize {
public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; private long getTotalSizeOfFilesInDir(final ExecutorService service,
final File file) throws InterruptedException, ExecutionException,
TimeoutException {
if (file.isFile())
return file.length(); long total = 0;
final File[] children = file.listFiles(); if (children != null) {
final List<Future<Long>> partialTotalFutures = new ArrayList<Future<Long>>();
for (final File child : children) {
partialTotalFutures.add(service.submit(new Callable<Long>() {
public Long call() throws InterruptedException,
ExecutionException, TimeoutException {
return getTotalSizeOfFilesInDir(service, child);
}
}));
} for (final Future<Long> partialTotalFuture : partialTotalFutures)
total += partialTotalFuture.get(100, TimeUnit.SECONDS); } return total; } private long getTotalSizeOfFile(final String fileName)
throws InterruptedException, ExecutionException, TimeoutException {
final ExecutorService service = Executors.newFixedThreadPool(100);
try {
return getTotalSizeOfFilesInDir(service, new File(fileName));
} finally {
service.shutdown();
}
} public static void main(final String[] args) throws InterruptedException,
ExecutionException, TimeoutException {
final long start = System.nanoTime();
final long total = new NaivelyConcurrentTotalFileSize()
.getTotalSizeOfFile(fileName);
final long end = System.nanoTime();
System.out.println("Total Size: " + total);
System.out.println("Time taken: " + (end - start) / 1.0e9);
}
}

(四)使用CountDownLatch和AtomicLong实现多线程下的并发控制

package com.taobao.test;

import java.io.File;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong; public class ConcurrentTotalFileSizeWLatch {
private ExecutorService service;
final private AtomicLong pendingFileVisits = new AtomicLong();
final private AtomicLong totalSize = new AtomicLong();
final private CountDownLatch latch = new CountDownLatch(1);
public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; private void updateTotalSizeOfFilesInDir(final File file) {
long fileSize = 0;
if (file.isFile())
fileSize = file.length();
else {
final File[] children = file.listFiles();
if (children != null) {
for (final File child : children) {
if (child.isFile())
fileSize += child.length();
else {
pendingFileVisits.incrementAndGet();
service.execute(new Runnable() {
public void run() {
updateTotalSizeOfFilesInDir(child);
}
});
}
}
}
}
totalSize.addAndGet(fileSize);
if (pendingFileVisits.decrementAndGet() == 0)
latch.countDown();
} private long getTotalSizeOfFile(final String fileName)
throws InterruptedException {
service = Executors.newFixedThreadPool(100);
pendingFileVisits.incrementAndGet();
try {
updateTotalSizeOfFilesInDir(new File(fileName));
latch.await(100, TimeUnit.SECONDS);
return totalSize.longValue();
} finally {
service.shutdown();
}
} public static void main(final String[] args) throws InterruptedException {
final long start = System.nanoTime();
final long total = new ConcurrentTotalFileSizeWLatch()
.getTotalSizeOfFile(fileName);
final long end = System.nanoTime();
System.out.println("Total Size: " + total);
System.out.println("Time taken: " + (end - start) / 1.0e9);
}
}

(五)使用BlockingQueue和AtomicLong的实现

package com.taobao.test;

import java.io.File;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong; public class ConcurrentTotalFileSizeWQueue {
public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; private ExecutorService service;
final private BlockingQueue<Long> fileSizes = new ArrayBlockingQueue<Long>(
500);
final AtomicLong pendingFileVisits = new AtomicLong(); private void startExploreDir(final File file) {
pendingFileVisits.incrementAndGet();
service.execute(new Runnable() {
public void run() {
exploreDir(file);
}
});
} private void exploreDir(final File file) {
long fileSize = 0;
if (file.isFile())
fileSize = file.length();
else {
final File[] children = file.listFiles();
if (children != null)
for (final File child : children) {
if (child.isFile())
fileSize += child.length();
else {
startExploreDir(child);
}
}
}
try {
fileSizes.put(fileSize);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
pendingFileVisits.decrementAndGet();
} private long getTotalSizeOfFile(final String fileName)
throws InterruptedException {
service = Executors.newFixedThreadPool(100);
try {
startExploreDir(new File(fileName));
long totalSize = 0;
while (pendingFileVisits.get() > 0 || fileSizes.size() > 0) {
final Long size = fileSizes.poll(10, TimeUnit.SECONDS);
totalSize += size;
}
return totalSize;
} finally {
service.shutdown();
}
} public static void main(final String[] args) throws InterruptedException {
final long start = System.nanoTime();
final long total = new ConcurrentTotalFileSizeWQueue()
.getTotalSizeOfFile(fileName);
final long end = System.nanoTime();
System.out.println("Total Size: " + total);
System.out.println("Time taken: " + (end - start) / 1.0e9);
}
}

(六)使用jdk7的ForkJoin来实现

package com.taobao.test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask; public class FileSize {
private final static ForkJoinPool forkJoinPool = new ForkJoinPool();
public static String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk"; private static class FileSizeFinder extends RecursiveTask<Long> {
final File file; public FileSizeFinder(final File theFile) {
file = theFile;
} @Override
public Long compute() {
long size = 0;
if (file.isFile()) {
size = file.length();
} else {
final File[] children = file.listFiles();
if (children != null) {
List<ForkJoinTask<Long>> tasks = new ArrayList<ForkJoinTask<Long>>();
for (final File child : children) {
if (child.isFile()) {
size += child.length();
} else {
tasks.add(new FileSizeFinder(child));
}
}
for (final ForkJoinTask<Long> task : invokeAll(tasks)) {
size += task.join();
}
}
}
return size;
}
} public static void main(final String[] args) {
final long start = System.nanoTime();
final long total = forkJoinPool.invoke(new FileSizeFinder(new File("/home")));
final long end = System.nanoTime();
System.out.println("Total Size: " + total);
System.out.println("Time taken: " + (end - start) / 1.0e9);
}
}

最新文章

  1. js严格模式总结(转~)原文地址http://www.cnblogs.com/chayan/p/5793964.html
  2. 【译】用Fragment解决屏幕旋转(状态发生变化)状态不能保持的问题
  3. poj 2385Apple Catching(简单dp)
  4. python 之ConfigParser
  5. 使用 Environment Indicator 模块区分不同的 Drupal 环境
  6. 洛谷P2728 纺车的轮子 Spinning Wheels
  7. 剑指 offer set 2 从头到尾打印链表
  8. sqlserver删除重复数据
  9. Rendering Transparent 3D Surfaces in WPF with C#(转载)
  10. Java Base64编码与图片互转
  11. 完成端口(Completion Port)详解(超级长,超级清楚)
  12. MySQL优化总结,百万级数据库优化方案
  13. php 中的closure用法
  14. openGPS.cn - 高精度IP定位原理,定位误差说明
  15. ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录
  16. Bootstrap-datepicker3官方文档中文翻译---I18N/国际化(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)
  17. 浅谈 R_S触发器
  18. python tkinter messagebox
  19. mysql统计一年12月的数据
  20. Leetcode 153. Find Minimum in Rotated Sorted Array -- 二分查找的变种

热门文章

  1. JD
  2. POJ 1795 DNA Laboratory(状压DP)
  3. InputSplit—&gt;RecordReder—&gt;map(key,value,context)的过程解析
  4. [BZOJ1179][APIO2009][强连通分量Tarjan+spfa]ATM
  5. MySQL索引,MySQL中索引的限制?
  6. canvas实现&quot;雷达扫描&quot;效果
  7. AutoCAD中导入图片
  8. axure产品原型图,元件库导入方法
  9. devops流程
  10. windows 用wireshark抓本机的包