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

时间:2017-05-07 19:17:30

标签: java multithreading concurrency thread-safety

我有一个关于并发的项目,我的代码行为有些麻烦。我正在走一个文件树来查找所有文件,如果我找到一个以.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;       
}

0 个答案:

没有答案