packagecom.taobao.test;importjava.io.File;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Future;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.TimeoutException;public classConcurrentTotalFileSize {public static final String fileName = "C:\\Documents and Settings\\Administrator\\桌面\\monkeytalk";classSubDirectoriesAndSize {final public longsize;final public ListsubDirectories;public SubDirectoriesAndSize(final longtotalSize,final ListtheSubDirs) {
size=totalSize;
subDirectories=Collections.unmodifiableList(theSubDirs);
}
}private SubDirectoriesAndSize getTotalAndSubDirs(finalFile file) {long total = 0;final List subDirectories = new ArrayList();if(file.isDirectory()) {final File[] children =file.listFiles();if (children != null)for (finalFile child : children) {if(child.isFile())
total+=child.length();elsesubDirectories.add(child);
}
}return newSubDirectoriesAndSize(total, subDirectories);
}private long getTotalSizeOfFilesInDir(finalFile file)throwsInterruptedException, ExecutionException, TimeoutException {final ExecutorService service = Executors.newFixedThreadPool(100);try{long total = 0;final List directories = new ArrayList();
directories.add(file);while (!directories.isEmpty()) {final List> partialResults = new ArrayList>();for (finalFile directory : directories) {
partialResults.add(service
.submit(new Callable() {publicSubDirectoriesAndSize call() {returngetTotalAndSubDirs(directory);
}
}));
}
directories.clear();for (final FuturepartialResultFuture : partialResults) {final SubDirectoriesAndSize subDirectoriesAndSize =partialResultFuture
.get(100, TimeUnit.SECONDS);
directories.addAll(subDirectoriesAndSize.subDirectories);
total+=subDirectoriesAndSize.size;
}
}returntotal;
}finally{
service.shutdown();
}
}public static void main(final String[] args) throwsInterruptedException,
ExecutionException, TimeoutException {final long start =System.nanoTime();final long total = newConcurrentTotalFileSize()
.getTotalSizeOfFilesInDir(newFile(fileName));final long end =System.nanoTime();
System.out.println("Total Size: " +total);
System.out.println("Time taken: " + (end - start) / 1.0e9);
}
}