2

現在のスレッドをフリーズするために使用できることはわかっていThread.sleep(1000);ますが (この例では 1 秒間)、スローする必要があるため、Exception安全に使用できるかどうか疑問に思っています。プログラムで使用して、誤って問題を引き起こしたくありません。

使用しても「OK」Thread.sleep();ですか、それとも同じ結果を達成するためのより良い方法はありますか?

4

5 に答える 5

16

余談ですが、スリープ状態になり、割り込みを使用しないことがわかっている場合、InterruptedExceptions の処理を​​回避する便利な方法は、Guava の Uninterruptibles を使用することです。

Uninterruptibles.sleepUninterruptibly(1000, TimeUnit.MILLISECONDS);

これは、InterruptedException が推奨される方法 (つまり、中断されたステータスのリセット) でスローされた場合に透過的に処理し、見苦しい try-catch ブロックを回避します。

于 2013-01-07T12:33:53.950 に答える
6

例外をスローする必要があるため、安全に使用できるかどうか疑問に思っています。

Thread#sleep は 2 つの例外のみをスローします

  • IllegalArgumentExceptionパラメータが負の場合
  • InterruptedExceptionスレッドが中断された場合

=> 正の数を渡してもスレッドが中断されない場合、例外は発生しません。

theThread.interrupt()別のスレッドから呼び出さない限り、問題ありません。

編集

タイマーを作成したいようです-その場合、組み込みのメカニズムを使用することで、人生をより簡単にすることができます:

Runnable r = new Runnable() {
    public void run() { runYourTaskHere(); }
};
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS);
于 2013-01-07T12:28:10.453 に答える
0

何をしようとしているのかにもよりますが、使用されているのを見てきThread.sleepましたが、通常はプログラミングの間違いを修正するために使用されます。これは、人々が競合状態を解決すると考えているためです。 Thread.sleepJavaはCPUを制御しないため(最後にチェックした)、例外をスローする必要があるため、CPUにバグがある場合、またはそうでない場合でもスレッドを早期に起動/何らかの方法でプログラム(Java)に割り込みます自身を終了し、メッセージをスタックに伝搬する方法が必要です。さらに、これは「同じ結果」の意味に大きく依存します

于 2013-01-07T12:28:55.883 に答える
0

それは完全に安全です。InterruptedException は JVM によって提供されているため、必要に応じて処理できます (このスレッドが中断されたときに何か特別なことをしたいとします)。実際には、何か悪いことが起こったことを意味するわけではありません。

于 2013-01-07T12:29:44.383 に答える
0

thread.sleep現在のスレッドを指定された時間中断します (強制終了しません) 。だから安心して使えます。

于 2013-01-07T13:17:27.907 に答える