3

Javaの特定の時間からミリ秒単位で経過した時間を計算したいと思います。

開始時間に使用する従来の方法。System.currentTimeMillis();次に、これを前の方法で再度使用して、経過時間を取得します。これに似たようなことをしたいのですが、システム時間に依存しないでください。

システム時間に依存している場合、プログラムのユーザーはシステムクロックを操作してプログラムをハッキングする可能性があります。

次のようなコードを使用してみました。

int elapsed = 0;
while (true) {
    Thread.sleep(10);
    elapsed += 10;
}

これは機能しますが、コンピューターが遅れて1、2秒ロックする場合は、あまり信頼できません。

誰かアイデアはありますか?

4

1 に答える 1

6

利用したいSystem.nanoTime。システムクロックとは関係ありません。それはあなたがしたいすべてであるように思われる相対的な時間を追跡するためにのみ使用することができます。

この回答が別の回答へのリンクになるのを防ぐために、ここに簡単な説明があります。

ドキュメントから

public static long nanoTime()利用可能な最も正確なシステムタイマーの現在の値をナノ秒単位で返します。

この方法は経過時間を測定するためにのみ使用でき、システムや実時間のその他の概念とは関係ありません。返される値は、固定されているが任意の時間からのナノ秒を表します(おそらく将来的には、値が負になる可能性があります)。この方法はナノ秒の精度を提供しますが、必ずしもナノ秒の精度である必要はありません。値が変更される頻度については保証されません。約292年(2 63ナノ秒)を超える連続した呼び出しの違いは、数値のオーバーフローのために経過時間を正確に計算しません。

タイマー情報へのさらに別のリンク:https ://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks

JavaのTimerクラスを使用して、特定の精度で「チェック」コールバックを生成できます。たとえば、500ミリ秒ごとです。このコールバックは、500msが実際に通過したことを判別するためには使用されません。コールバックを呼び出しSystem.nanoTimeて、最後に呼び出したときと比較しますSystem.nanoTime。これにより、壁掛け時計の変更に関係なく、経過した時間をかなり正確に表すことができます。

ここで見ることができます:System.currentTimeMillis vs System.nanoTime

于 2012-05-29T01:08:18.523 に答える