12

Java Futures()を使用して複数の同様のプロセス(SIMD)を実行するために私が思いつくことができる唯一のモデルjava.util.concurrent.Future<T>は、次のとおりです。

class Job extends Callable<T> {
  public T call() {
    // ...
  }
}
List<Job> jobs = // ...
List<Future<T>> futures = ExecutorService.invokeAll(jobs);
for (Future<T> future : futures) {
  T t = future.get();
  // Do something with t ...
}

このモデルの問題は、ジョブ0の完了に長い時間がかかるが、ジョブ1、2、および3がすでに完了している場合、forループはジョブ0からの戻り値の取得を待機することです。

まだ準備ができていない場合は、電話をかけたり、ビジーウェイト(または電話)をしたりFutureせずに、各結果が利用可能になったときに各結果を取得できるモデルはありますか?Future.isDone()Thread.sleep()

4

4 に答える 4

15

あなたは試してみることができますExecutorCompletionService

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorCompletionService.html

すべての先物を受け取るまで、タスクを送信してテイクを呼び出すだけです。

于 2011-05-04T11:01:15.880 に答える
14

グアバListenableFutureからの使用を検討してください。基本的に、将来が完了したときに実行する継続を追加できます。

于 2011-05-04T11:01:00.687 に答える
0

やりたいことを仕事に加えてみませんか?

class Job extends Runnable {
  public void run() {
    // ...
    T result = ....
    // do something with the result.
  }
}

そうすれば、結果が利用可能になり次第、同時に処理されます。;)

于 2011-05-04T11:19:40.803 に答える
0

利用可能な結果についてACompletionServiceをポーリングできます。

ただし、利用可能になった結果だけが必要な場合は、AsyncCompleter完了サービスの使用法の詳細を抽象化したものを作成しました。Iterable<Callable<T>>これにより、 ofジョブを送信し、Iterable<T>結果をブロックしnext()て完了順に返すof結果を返すことができます。

于 2011-05-04T23:13:01.507 に答える