我承认标题很高大上,其实只是一个初中生的无聊研究。
ps:如果有建议,随便提。
正文:
试验方法:
不限制深度,但限制时间。在同一个根目录(C:\)开始搜索,过滤出dll文件,第一次用普通方法(单线程),记录查找到的文件数目,第二次用线程级的方法(多线程),一样记录数目。对比两次实验的结果,得到结论。
代码片段:
目录的深度优先算法(普通版的)(自写的,不知道是不是最优-->_-->):
public static Function<String, Predicate<File>> isendwith = s
-> isDic.negate().and(f -> f.getName().toUpperCase().endsWith(s.toUpperCase()));
private long size = 0;
boolean stop = false;
private void search(File f, int deepth, String n) {
if (stop) {
return;
}
//if(deepth <= 0)
//return;
File[] files = f.listFiles();
if (files == null) {
return;
}
List<File> list = Arrays.asList(files);
size += list.stream().filter(isendwith.apply(n)).count();
list.stream().filter(isDic).forEach(fi -> search(fi, deepth - 1, n));
list = null;
files = null;
}
其中 stop 为控制是否结束的变量
线程版的(有点多):
第一个类:BLockingStack
一个线程安全的栈,用以存放搜索到的目录。用来放Inf类。
(原理参见,虽然是阻塞队列:http://www.cnblogs.com/yjmyzz/p/BlockingQueue-in-java.html)
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.locks.ReentrantLock;
import java.ut