3

いくつかのタスクをExecutorusingにサブミットした場合、返された s のそれぞれをinvokeAll呼び出さなくても、サブミットされたスレッドがタスク実行のすべての副作用を見ることが保証されますか?get()Future

実用的な観点からは、これは有用な保証になるように思われますが、javadoc には何も表示されません。

より正確にはCallable、executor に送信された の本体内のすべてのアクションは、呼び出しから戻る前に発生しますか?invokeAll()

get()実際には戻り値の型が であり、例外がスローされない場合に、各Future を無駄に呼び出すのは面倒ですVoid。すべての作業は副作用として発生します。

4

2 に答える 2

2

ExecutorServiceのドキュメントから:

Runnable または Callable タスクを ExecutorService に送信する前のスレッド内のアクションは、そのタスクによって実行されるすべてのアクションの前に発生し、結果は Future.get() を介して取得される前に発生します。

これを読んだとき、タスクの送信にはメモリバリアがあるため、リストの最後のタスクを呼び出す必要がある可能性がありますが、他のタスクは必要ありません。get()

ただし、呼び出しget()はタスクが完了したかスローされたかを判断する唯一の方法であるためFuture、メモリの保証に関係なく、すべての で呼び出します。

于 2011-09-14T11:45:27.510 に答える
1

invokeAny()戻り時にまだ実行中のタスクがないことを約束する場合invokeAny()、これが当てはまります。すべての副作用が表示されます。

すべてのタスクが完了したことをinvokeAny()が知るには、それらのスレッドと同期している必要があります。つまり、関数の戻りは、タスク (およびタスクで発生するすべてのこと) の完了後に発生します。ただし、'ExecutorSerive' と 'Future.cancel()' の API は、実行中のタスクをキャンセルしたときに何が起こるかを明示的に示していません (特に: はcancel()、タスクの実行が停止するまで戻るまで待機します。呼び出した後cancel()isDone()戻る必要があるという事実true はcancel()、タスクの実行が実際に終了するまで戻らないことを意味します。

注意すべきもう 1 つの点は、オブジェクトinvokeAny() を検査せずに使用すると、タスクが実行を開始したかどうかがわからないことです。Future

于 2011-09-14T08:25:28.173 に答える