17

タイムアウトが 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();
   }
4

2 に答える 2

10

必要に応じて、指定された時間だけ待機します…

最大で0 の時間単位を待機することは、まったく待機していません。これは暗黙のヒントではなく、明示的な保証です。

于 2012-02-17T17:46:55.617 に答える
8

タイムアウトが 0 の 'Future.get' が待機しないことを明確にするドキュメントを誰か教えてもらえますか?

それが役立つ場合は、いくつかのコードを指摘できます。調べてjava.util.concurrent.FutureTaskからAbstractQueuedSynchronizer、関連するビットを表示するために切り詰めた次のループが表示されます。

private boolean doAcquireSharedNanos(int arg, long nanosTimeout) {
    long lastTime = System.nanoTime();
    for (;;) {
        ...
        if (nanosTimeout <= 0) {
            cancelAcquire(node);
            return false;
        }
        long now = System.nanoTime();
        nanosTimeout -= now - lastTime;
    }

これは、ifnanosTimeoutが 0 の場合 (get に 0 を渡した場合)、future を一度取得しようとし、タイムアウトして false を返すことを意味します。

気分が良くなった場合は、タイムアウトを 1 ナノ秒に設定できます。

于 2012-02-17T17:46:35.947 に答える