タイムアウトが0のfuture.getの動作
-
27-10-2019 - |
質問
タイムアウトが0の 'Future.get`が待機しないことを明確にするドキュメントを誰かに教えてもらえますか?
java.util.concurrent.Future
のAPIドキュメントでは、future.get(0, unit)
の動作を明示していません。自立して、「必要に応じて最大で一定時間待機する...」というステートメントは、この呼び出しがまったく待機しないことを意味しますが、Object.wait(0)
の長年の動作(無限待機)を考えると、私は依存することに神経質になっていますfuture.get(0, unit)
の「待機なし」の動作について
JDKが提供するいくつかのクラスのソースをスキャンする(つまり、FutureTask
)タイムアウトが0の場合、Future
のこの特定の実装は待機しないことがわかります。
言いたいのですが ジェネラコディセタグプレ
しかし、Futureがそれを無限の待機として実装することに神経質になっているので、代わりに、期待どおりに機能するように明示的にコーディングしました。 ジェネラコディセタグプレ
解決
必要に応じて、最大で所定の時間待機します…
最大で ゼロ時間単位を待機することはまったく待機していません。これは暗黙のヒントではなく、明示的な保証です。
他のヒント
タイムアウトが0の 'Future.get`が待機しないことを明確にするドキュメントを誰かに教えてもらえますか?
それが役立つ場合は、いくつかのコードを紹介できます。
java.util.concurrent.FutureTask
を調べてから、AbstractQueuedSynchronizer
を見ると、関連するビットを表示するために簡略化した次のループが表示されます。 ジェネラコディセタグプレこれは、
nanosTimeout
が0の場合(取得するために0を渡した場合)、futureを一度取得しようとし、その後タイムアウトしてfalseを返すことを意味します。気分が良くなった場合は、タイムアウトを1ナノ秒に設定できます。