Java Futuresからの注文不足
-
28-10-2019 - |
質問
Java先物を使用して複数の同様のプロセス(SIMD)を実行するために思いつくことができる唯一のモデル(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()
)まだ準備ができていない場合は?
解決
あなたは試すことができます ExecutorCompletionService
:
http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/executorcompletionservice.html
すべての先物を受け取るまで、タスクを送信し、電話をかけるだけです。
他のヒント
使用を検討してください ListenableFuture
から グアバ. 。彼らは基本的に、未来が完了したときに実行するために継続を追加することができます。
仕事にやりたいことを追加してみませんか?
class Job extends Runnable {
public void run() {
// ...
T result = ....
// do something with the result.
}
}
そうすれば、同時に利用可能になったらすぐに結果が処理されます。 ;)
a CompletionService
利用可能な結果のために投票することができます。
しかし、あなたが望むのがそれらが利用可能になったときの結果だけであるならば、私たちは書いた AsyncCompleter
それは、完了サービスの使用の詳細を抽象化します。提出できます Iterable<Callable<T>>
仕事と返品の Iterable<T>
ブロックする結果の next()
結果を完了順に返します。