package jdepend.framework.file.gather; import java.io.File; import jdepend.framework.util.ThreadPool; class ConcurrentFileGatherUtil extends AbstractFileGatherUtil { ThreadSecurityTargetFiles files;// 所有的文件统计结果 Count count;// 跟踪并发线程数实体 final int threadCount = ThreadPool.ThreadCount;// 并发线程数上限 ConcurrentFileGatherUtil() { } protected TargetFiles doGather() { files = new ThreadSecurityTargetFiles(); count = new Count(); // 分路径进行扫描 for (File directory : this.getDirectories()) { files.addPlace(directory.getPath()); collectFiles(directory.getPath(), directory); } // 等到多个线程是否都结束 synchronized (count) { while (count.count != 0) { try { count.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } // 返回结果 return files.toTargetFiles(); } void collectFiles(final String rootDir, File directory) { if (directory.isDirectory()) { String[] directoryFiles = directory.list(); // 搜索文件夹下的文件或文件夹 for (int i = 0; i < directoryFiles.length; i++) { final File file = new File(directory, directoryFiles[i]); if (acceptFile(file)) { files.addFile(rootDir, file);// 将文件计入结果 } else if (file.isDirectory()) { boolean newThread = false;// 是否开启新的线程计算文件夹下的文件数量 synchronized (count) { if (count.count < threadCount) { count.count++; newThread = true; count.notify(); } } if (newThread) { new Thread() {// 开启新线程进行统计 public void run() { collectFiles(rootDir, file); // 当前文件夹搜索结束后,线程任务结束,改变跟踪并发线程数实体的值 synchronized (count) { count.count--; count.notify(); } } }.start(); } else { collectFiles(rootDir, file);// 在当前线程内进行统计 } } } } else if (acceptFile(directory)) { files.addFile(rootDir, directory);// 将文件计入结果 } } } class Count { Integer count = 0; }