gpt4 book ai didi

java - ExecutorService 并发行为不稳定且不稳定

转载 作者:行者123 更新时间:2023-11-30 06:44:53 26 4
gpt4 key购买 nike

我有一个关于并发的项目,但我的代码行为遇到了一些问题。我正在遍历文件树来查找所有文件,如果我找到以 .txt 结尾的文件,我会向执行器提交一个任务。线程将打开文件并检查文件中最大的数字。然后,我创建一个对象,它保存文件的路径和该文件的最大数字。我将该对象附加到同步数组列表中。但是当我运行代码时,我的数组列表有时有 1 个对象,或者 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;
}

最佳答案

您只需在 waitTermination 调用中等待 1 纳秒,ExecutorService 就会关闭。因此,您可能会在处理某些文件之前打印同步列表。

关于java - ExecutorService 并发行为不稳定且不稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43835617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com