タイムアウトが 0 の 'Future.get' が待機しないことを明確にするドキュメントを誰か教えてもらえますか?
の API ドキュメントはjava.util.concurrent.Future
、 の動作を明示していませんfuture.get(0, unit)
。単独で、「必要に応じて最大で指定された時間まで待機します...」というステートメントは、この呼び出しがまったく待機しないことを意味しますが、(無限待機) の長年の動作を考えると、Object.wait(0)
依存するのは緊張します。の「待機なし」動作future.get(0, unit)
いくつかの JDK 提供のクラス (viz.) のソースをスキャンすると、タイムアウトが 0 の場合、この特定の実装が待機しないFutureTask
ことがわかります。Future
言えるようになりたい
long timeout = Math.max(until - now, 0);
return future.get(timeout, TimeUnit.MILLISECONDS);
しかし、それを無限の待機として実装する Future については神経質になっているため、代わりに、期待どおりに機能するように明示的にコーディングしました。
long timeout = Math.max(until - now, 0);
if(timeout > 0 || future.isDone()){
return future.get(timeout, TimeUnit.MILLISECONDS);
} else {
throw TimeoutException();
}