JavaのThread.sleepはいつInterruptedExceptionをスローしますか? 無視しても安全ですか?私はマルチスレッドを行っていません。いくつかの操作を再試行する前に、数秒間待ちたいだけです。
7 に答える
通常、例外を無視しないでください。次の論文を見てください。
割り込みを飲み込まない
Runnable によって定義されたタスクが割り込み可能なメソッドを呼び出す場合など、InterruptedException をスローするオプションがない場合があります。この場合、InterruptedException を再スローすることはできませんが、何もしたくありません。ブロッキング メソッドが割り込みを検出して InterruptedException をスローすると、割り込み状態がクリアされます。InterruptedException をキャッチしても再スローできない場合は、割り込みが発生したという証拠を保持して、コール スタックの上位にあるコードが割り込みを認識し、必要に応じて応答できるようにする必要があります。このタスクは、リスト 3 に示すように、interrupt() を呼び出して現在のスレッドを「再中断」することによって実行されます。少なくとも、InterruptedException をキャッチして再スローしない場合は、戻る前に現在のスレッドを再中断します。
public class TaskRunner implements Runnable { private BlockingQueue<Task> queue; public TaskRunner(BlockingQueue<Task> queue) { this.queue = queue; } public void run() { try { while (true) { Task task = queue.take(10, TimeUnit.SECONDS); task.execute(); } } catch (InterruptedException e) { // Restore the interrupted status Thread.currentThread().interrupt(); } } }
ここで論文全体を参照してください。
http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-
Java Specialists ニュースレター (私はこれを惜しみなくお勧めします) に、これに関する興味深い記事と、InterruptedException
. 読んで消化する価値があります。
シングル スレッド コードでこれを処理する堅実で簡単な方法は、すべてのメソッドに対して宣言する必要がないように、これをキャッチして RuntimeException に戻すことです。
thread.sleep()
個人的な経験から、私は単にthis.sleep()
通常、InterruptedException
スリープが中断されたときにスローされます。