web-dev-qa-db-ja.com

JavaのObject.wait()は本当にナノ秒の精度を実現していますか?

私はJava 8の標準ライブラリのソースコードを好奇心から外してチェックアウトしましたが、これは_Java/lang/Object.Java_で見つかりました。waitという名前の3つのメソッドがあります。

  • public final native void wait(long timeout):これは、ネイティブ実装を持つすべての待機メソッドの中核です。
  • public final void wait()wait(0)を呼び出すだけです。
  • そしてpublic final void wait(long timeout, int nanos)があります。

特定のメソッドのJavaDoc は私に次のように伝えます:

このメソッドは、1つの引数のwaitメソッドに似ていますが、中止する前に通知を待つ時間をより細かく制御できます。ナノ秒で測定されるリアルタイムの量は、次の式で与えられます。

_1000000*timeout+nanos
_

しかし、これはメソッドがどのように「待機する時間をより細かく制御する」を達成するかです。

_if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
    timeout++;
}

wait(timeout);
_

したがって、このメソッドは基本的にナノ秒からミリ秒の粗い丸めを行います。言うまでもなく、0.5ミリ秒未満は1ミリ秒に切り上げられます。

このコードは悪い/不要ですか、またはこのメソッドを宣言することの目に見えない美徳が欠けていますか? その引数なしのいとこ がそうであるように?

3
sampathsris

サブミリ秒の精度がすぐそこにあり、彼らは前向きに考えているということが起こると思います。

新しい方法が必要なため、マイクロ秒ではなく、設計者はナノ秒に直接進むことを決定しました。今日、このレベルの精度が必要なためではなく、将来に備える必要があります。

時間をミリ秒に丸める実装は、互換性のためにあります。より高速なコンピューターとJVMで新しいメソッドを利用できる一方で、呼び出しをミリ秒の精度にマップする古いJVMでも同じコードが実行されます。

5
Florian F