Java ExecutorService并发行为不稳定且不稳定
我有一个关于并发的项目,我的代码的行为有一些问题。我正在遍历文件树以查找所有文件,如果我找到一个以.txt结尾的文件,我将向执行者提交一个任务。一个线程将打开文件并检查文件中最大的数字。然后我创建一个对象,它保存文件的路径和该文件的最大数字。我将对象附加到同步的arraylist。但是当我运行代码时,我的arraylist中有时有1个对象,或者5个、112个或64个。每次运行时应该有140个对象。我希望你们知道问题出在哪里Java ExecutorService并发行为不稳定且不稳定,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,我有一个关于并发的项目,我的代码的行为有一些问题。我正在遍历文件树以查找所有文件,如果我找到一个以.txt结尾的文件,我将向执行者提交一个任务。一个线程将打开文件并检查文件中最大的数字。然后我创建一个对象,它保存文件的路径和该文件的最大数字。我将对象附加到同步的arraylist。但是当我运行代码时,我的arraylist中有时有1个对象,或者5个、112个或64个。每次运行时应该有140个对象。我希望你们知道问题出在哪里 public static List< Result > A
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;
}
publicstaticlistAllFiles(Path dir)抛出InterruptedException{
最终列表结果列表=新的ArrayList();
最终名单;
synclist=Collections.synchronizedList(结果列表);
执行服务执行官
=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()+1);
试一试{
Files.walk(dir).forEach(i->{
字符串pathfile=i.getFileName().toString();
if(pathfile.contains(“.txt”)){
执行提交(()->{
int high=findHighest(i);
ResultToBj obj=新结果ToBj(i,高);
synclist.add(obj);
});
}
});
exec.shutdown();
试一试{
执行等待终止(1,时间单位纳秒);
}catch(InterruptedException ex){}
}catch(IOException ex){}
System.out.println(同步列表);
System.out.println(synclist.size());
返回同步列表;
}
在等待终止呼叫中,您只需等待1纳秒,Executor服务就会关闭。因此,您可能在处理某些文件之前打印了同步列表。谢谢您在我关闭executor之前所说的正确。我用倒计时锁来确保每一个线程都完成了。