我有一个关于并发的项目,我的代码行为有些麻烦。我正在走一个文件树来查找所有文件,如果我找到一个以.txt结尾的文件,我会向执行者提交一个任务。线程将打开文件并检查文件中最大的数字。然后我创建一个对象,它保存文件的路径和该文件的最大编号。我将对象追加到同步的arraylist。但是当我运行代码时,我的arraylist有时会有一个对象或5或112或64.每次运行它时应该有140个对象。我希望你们知道问题所在。
public static List< Result > AllFiles( Path dir ) throws InterruptedException{
final List<Result> resultlist = new ArrayList<Result>();
final List<Result> synclist;
synclist = Collections.synchronizedList(resultlist);
ExecutorService exec
= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
try {
Files.walk(dir).forEach(i -> {
String pathfile = i.getFileName().toString();
if (pathfile.contains(".txt")) {
exec.submit(() -> {
int high = findHighest(i);
ResultObj obj = new ResultObj(i, high);
synclist.add(obj);
});
}
});
exec.shutdown();
try {
exec.awaitTermination(1, TimeUnit.NANOSECONDS);
} catch (InterruptedException ex) {}
} catch (IOException ex) {}
System.out.println(synclist);
System.out.println(synclist.size());
return synclist;
}