私が自分のコードを書くときはいつでもThread.sleep(500);
、これが時々使用に問題を引き起こすことがあると教えてくれますThread.sleep();
。特定のものの前に時間を遅らせる別の方法はありますか. もしそうなら、コードと説明を教えてください。ありがとうございました
3 に答える
まず、あなたは私たちにコードを見せず、「それ」が何であるかについて言及していません。(「それはいつも私に言う...」のように。)これは特定の答えを不可能にします。
sleep
言及されている問題は、コードが無駄になったり、応答しなくなったりすることである可能性が最も高いです。スレッドを何らかの条件で待機させるために使用される一般的な「ハック」は、スリープを繰り返し呼び出してから条件をテストすることです。問題は、スリープ中に条件が真になると、スリープ間隔が切れるまでスレッドが停止することです。スリープ間隔を短くすると、ウェイクアップ/テスト/スリープの繰り返しでより多くの CPU サイクルを「消費」します。
「何らかの条件が真になるのを待つ」を実装しようとしている場合、それを行う効率的な方法は、wait()
and notify()
(またはnotifyAll()
)、または適切な上位レベルの同期クラスを使用することです。
古典的な Java パターンは次のようになります。
// waiting for the condition
synchronized (obj) {
while (!condition) {
obj.wait();
}
}
...
// updating the condition ...
synchronized (obj) {
// do something that makes condition true
obj.wait();
}
synchronized
wait/notify を使用する場合は、 の使用が必須であることに注意してください。
Condition
インターフェイスは、他のスレッドが特定のイベントについて通知し、現在のスレッドにそれまで「パーク」するように依頼するのに役立ちます。Condition
インターフェイスにはwaitUntil(Date deadline)
- と呼ばれるメソッドもあり、現在のスレッドは期限が経過するまで待機します。
他のスレッドが何らかのアクティビティを実行するのを待っていて、それまで待っていますか? などのブロッキング データ構造BlockingQueue
や、その他の高度なシンクロナイザを使用しますCountdownLatch
。
一部のスレッドが実行を完了するのを待っているだけの場合は、join()
.
MadProgrammer と alfasin が述べたように、何を達成しようとしているのか、何sleep()
について話しているのかを知ることが重要です。
近い将来に何かが起こるようにしたい場合、スリープを繰り返し使用するのは悪いことです. 1 つは「時間どおり」であることを保証するものではなく、2 番目はいつでも中断され、プログラムが誤動作する可能性があります。
繰り返し実行する必要があるコードの一部がある場合、Timerを使用するとそれを完全に解決できます。特定の遅延で実行する必要があるコードの複数の異なる部分がある場合は、ScheduledExecutorServiceを使用する必要があります。ScheduledThreadPoolExecutor を直接使用するか、より便利に ExecutorService を使用できます。
単一のスレッドを使用するだけで、スレッドの問題を簡単に回避できます。ただし、適切なツールを使用すれば、Java でのスレッド化はそれほど難しくありません。