2017-05-07 17 views
1

私は並行処理に関するプロジェクトを持っており、私のコードの動作にいくつかの問題があります。私はすべてのファイルを見つけるためにファイルツリーを歩いています。もし.txtで終わるファイルを見つけたら、私はexecutorにタスクを提出します。スレッドがファイルを開き、ファイル内のどの番号が最大であるかを確認します。次に、ファイルのパスとそのファイルの最大番号を保持するオブジェクトを作成します。私は同期されたarraylistにオブジェクトを追加します。しかし、私がコードを実行するとき、私のarraylistは、1つのオブジェクトまたは5または112または64を持っていることがあります。私はそれを実行するたびに140オブジェクトがある必要があります。私はあなたが問題が何であるか知っていることを願っています。ExecutorServiceの同時実行が不安定で不安定になる

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;  
} 

答えて

1

ExecutorServiceがシャットダウンするawaitTermination呼び出しで1ナノ秒だけ待機しています。その結果、ファイルの一部が処理される前にsynclistを印刷している可能性があります。

+1

実行前にエグゼキュータをシャットダウンしてくれてありがとうございました。 CountDownLatchを使ってすべてのスレッドが完了したことを確認しました。 – AwsGuy

関連する問題