0

いくつかの「呼び出し可能な」スレッドを開始する「実行可能な」スレッドが 1 つあり、上記のすべてのスレッドがジョブを終了したときに結果を表示したいと考えています。

それを行う最良の方法は何ですか?

私のコードは次のとおりです

Connector.java (実行可能なスレッドの開始)

  public class Connector {
                      private static void anyFileConnector() {
                    // Starting searching Thread
                        ExecutorService executor = Executors.newFixedThreadPool(100);
                        executor.submit(traverse, executor);
//HERE I WANT MY ALL SEARCH RESULTS/OUTPUT : CURRENTLY IT IS STARTING OTHER THREADS AND NOT SHOWING ME ANY RESULTS BECAUSE NONE OF THEM WAS FINISHED.(IN CONSOLE, I WAS ABLE TO SEE RESULTS FROM ALL THE THREADS
        setSearchResult(traverse.getResult());

                    executor.shutdown();
            }
    }

Traverse.java (Runnable Thread) ExecutorCompletionService を使用して処理していますが、違いはありませんでした。:(

public class Traverse implements Runnable {
    public void run() {

    ExecutorService executor = Executors.newFixedThreadPool(100);
    ExecutorCompletionService<List<ResultBean>> taskCompletionService =
            new ExecutorCompletionService<List<ResultBean>>(executor);
    try (DirectoryStream<Path> stream = Files
            .newDirectoryStream(dir)) {
                Search newSearch = new Search();
                taskCompletionService.submit(newSearch);
     }
    list.addAll(taskCompletionService.take().get());
    }
}

Search.java (呼び出し可能スレッド)

public class Search implements Callable<List<ResultBean>> {
 public List<ResultBean> call() {
        synchronized (Search.class) {
// It will return results
            return this.search();
        }
    }

}
4

3 に答える 3

1

executor サービスの submit メソッドは、オブジェクトのリストを返すことができFutureます。あなたのケースでできることはisDone()、while ループでこれらの Future オブジェクトのメソッドを呼び出すことです。

今後のタスクが完了するたびに、このメソッドは true を返します。これでメソッドを呼び出しget()て、このタスクから返された値を取得できます。このようにして、特定のタスクが完了するのを待つことなく、すべての将来のタスクの値を把握できます (最初の将来のタスクの完了時間が最も長くなる可能性があるため)。

于 2013-09-03T08:44:08.553 に答える