Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ExecutorService并发行为不稳定且不稳定_Java_Multithreading_Concurrency_Thread Safety - Fatal编程技术网

Java ExecutorService并发行为不稳定且不稳定

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

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