2011-01-26 4 views
1

私は時計アプリケーションを書くでしょうし、私は文字通り私がThread.sleep(1000)方法に頼ることができる時間に各秒後にshort seconds値を大きくする必要がある場合は?私は同時に実行クロック数百万を持っているかどう時間スパンを数える最善の方法は何ですか?

それが正常に動作しますか?

+2

@AndriodNoob、この質問は、StackOverflowのに最適ですP.SEではなく –

答えて

2

それはあなたのスレッドは、実際に次の実行のときにとCPUスケジューラに任されていいえ、あなたは、のThread.sleep(1000)に頼ることはできません。その上で

CPUタイミングが正確に正確ではありませんので、あなたが適切なタイムサービス(原子時計)と同期ない限り、あなたは真の時から自然の偏差を取得します。

しかし、本当に「何百万のクロック」を実行しようと思っているのであれば、更新されている単一のタイマーを持っていて、クロックの各インスタンスでそのタイマーにオフセットを格納する方が良いでしょう。

また、スレッドがスリープする時間を削減するだけで、必要に応じて秒を更新することによって、あなたの精度を高めることができます。しかし、上記のように、睡眠時間はであり、は保証されていません。つまり、10秒間スリープ状態にしても、10秒以内に戻ることは技術的に可能です(または、<<insert arbitrary time here>>

0

秒単位で秒単位で更新する必要があります。可能であれば、それは、

。実際の​​クロックと同期してほぼ全二することができ、そこからあなただけのスレッドの睡眠を持ちたいとseconds値を更新し、そのイベントのプライオリティキューを持っていますそれぞれのアップデートでは、時計は優先待ち行列の前でイベントを見て、時間が経過していればそれを処理し、次のイベントをチェックします。

0

Java Concurrent APIパッケージを調べてください。マルチスレッドおよびノンブロッキングアルゴリズムを扱ういくつかの新しいAPIがあります。例えば

、代わりにあなたのプログラム呼び出しのThread.sleep(1000)を持つのは、[ScheduledExecutorService] [1]と毎秒を実行するタスクをスケジュール設定することができます。これによりコードが呼び出され、それを使用してクロックティックを更新します。これにより、より多くのプロデューサ/コンシューマモデルにコードが移行されます。 Java 5の、スレッドのような低レベルのアクセスの必要性(すなわち通知/待つ)で

が軽減されます。 Javaの同時パッケージに

を新しいもののいくつかを見てみましょう[1]:http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable、長い、長い、java.util.concurrent.TimeUnit)

関連する問題