8

Futuresに を送信することによって作成されCallableたのセットがありExecutorます。擬似コード:

for all tasks
  futures.add(executor.submit(new callable(task)))

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

for all futures
  future.get(timeout)

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

Futureしたがって、 s のリストとタイムアウトを受け入れ、すべてを並行して実行し、将来の結果のコレクションを返すメソッドを探しています。何か案は?

4

1 に答える 1

12

使用できますExecutorService.invokeAll

指定されたタスクを実行し、ステータスと結果を保持する Future のリストを返します。Future.isDone()返されたリストの各要素に対して true です。戻ると、完了していないタスクはキャンセルされます。完了したタスクは、通常どおり終了するか、例外をスローして終了する可能性があることに注意してください。この操作の進行中に指定されたコレクションが変更された場合、このメソッドの結果は未定義です。


Future監視する必要があり、使用できない が既にある場合はinvokeAll、タイムアウトを自分で測定するだけです。擬似コード:

long endTime = System.currentTimeMillis() + timeoutMS;
for(f : futures)
    f.get(Math.max(0, endTime - System.currentTimeMillis()), TimeUnit.MILLISECONDS);

このようにして、タイムアウトに達するまでの残りの期間を最大で各先物に与えます。

于 2013-07-02T20:31:39.237 に答える