2

数行を出力して 2 秒間スリープする callable を 1 つ作成しました。この callable の 10 個のインスタンスを作成し、ExecutorService の invokeALL メソッドに渡すメイン メソッドを作成しました。

 service.invokeAll(callableList, 3, SECONDS);

返された Future オブジェクトのリストを繰り返しているとき。CancellationException が発生しています。

すべてのfuture.get()呼び出しがCancellationExceptionを引き起こすのか、または完了できずにキャンセルされたタスクのみを引き起こすのかをテストしています。

invokeALLの時間設定に関係なく、すべての結果またはすべてのCancellationExceptionsを取得しています。

future.get()を呼び出すと、少なくともいくつかのタスクが完了して結果が返されることを本当に期待していました。

4

1 に答える 1

2

簡潔な答え。

すべてのタスクが 3 秒で完了しません。

長い答え。

TPE はすべてのタスクを実行し、完了するまで待機します。getメソッドの待機時間として 3 秒を使用して、各 Future で実行されgetます。すべてのタスクが 3 秒以内に完了した場合、Future のリストは影響を受けずに返されます。

予想される時間内に完了しない場合、未完了の先物はキャンセルされます。したがって、5 つのタスクがあり、最初の 2 つが完了しても 3 回目がタイムアウトした場合、3、4、5 はキャンセルされます。

ドキュメントに少し記載されています

戻り値: 指定されたタスク リストのイテレータによって生成されるのと同じ順序で、タスクを表す Future のリスト。操作がタイムアウトしなかった場合、各タスクは完了しています。タイムアウトした場合、これらのタスクの一部は完了していません。

戻ると、完了していないタスクはキャンセルされます。

于 2013-09-19T13:31:30.010 に答える