2013-07-02 8 views
6

CallableExecutorに提出して作成したFuturesのセットがあります。擬似コード:Futuresのバッチが完了するのを待っている間にタイムアウトしましたか?

すべての完了まで、すべての先物を最大でn秒待機させたいと思います。私はFuture#get(timeout)と呼ぶことができることを知っていますが、ループ内のすべての先物について順番に呼び出すと、タイムアウトが加算されます。擬似コード:

get結果が準備完了するまでブロックします。したがって、最初のタイムアウトがタイムアウトの直前に完了し、2番目のタイムアウトがタイムアウトの直前に完了すると、実行時間全体がtimeoutではなく、number of futures * timeoutになります。

したがって、私はFutureのリストとタイムアウトのリストを受け取り、すべてを並行して実行し、その後の結果のコレクションを返します。何か案は?

+0

これは完全にはっきりしていません。タイムアウトの期限が切れたときに完了していないタスクには、何が起こりたいのですか?あなたはそれらをキャンセルする、または続けることを許可しますか? –

+0

キャンセルする必要があります。また、どういうわけか、完成したものと完成しなかったものを知る必要があります。私は先物についてもう一度やり直すことができ、それらのすべてで 'isDone'を呼び出すことができると思います。 –

答えて

5

あなたはExecutorService.invokeAllを使用することができます。

は、いずれか早い方のすべての完全またはタイムアウトが満了したときに自分のステータスと結果を含むFutureのリストを、返す、与えられたタスクを実行します。 Future.isDone()は、返されるリストの各要素について真です。復帰時に、完了していないタスクは取り消されます。完了したタスクは、通常どおりまたは例外をスローすることによって終了する可能性があることに注意してください。この操作の進行中に指定されたコレクションが変更された場合、このメソッドの結果は未定義です。


あなたはすでにあなたが監視する必要があるとinvokeAllを使用することはできませんFuture秒を持っている場合は、単にタイムアウトを自分で測定することができます。擬似コード:

このようにして、あなたのタイムアウトに達するまで残された時間を各自に与えます。

+0

'ExecutorService.invokeAll'は、私が後にしているように聞こえます、ありがとう。完了していないすべての先物について、 'isCancelled == true'、右(これはJavadocを解釈する方法です)? 「未来」が例外なく完了したかどうかを知るにはどうすればよいでしょうか? "完了したタスクが正常に終了するか、または例外をスローすることによって終了する可能性があることに注意してください - それは難しいです... –

+1

@MarcelStörはい、未完了の未来は取り消されます(' isCancelled()== true')。あなたはそれを '' get() ''と呼ぶとき、' Future'に何が起こったのかを判断します(http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html# get%28%29)( 'invokeAll'が返った後)。 'get'が' CancellationException'をスローすると、キャンセルされたことがわかります。 'ExecutionException'をスローすると、' Future'が例外を伴って完了し、 'ExecutionException.getCause()'によって例外にアクセスできることを意味します。 –

関連する問題