1

長い間、次の関数を使用して現在のスレッドをしばらくスリープさせてきました。

class Utils {

static public sleep(int ms) {
  try {
     Thread.sleep(ms);
  } catch(InterruptedException x) {}
}

}

しかし、私は黙って例外を無視しているので、この関数が悪になる状況があるのでしょうか?

4

1 に答える 1

7

独自のコードで割り込みを使用していない場合は、次の方法で割り込み状態を維持する必要があります。

catch(InterruptedException x) {
    Thread.currentThread.interrupt();
}

または、投げることでより高い位置に対処できますInterruptedException。これにより、呼び出し元は割り込みが発生したことをすぐに知ることができます。それ以外の場合は、後で isInterrupted() を使用して確認できます。

フルタイムでスリープする必要がある場合は、割り込み後もスリープを継続し、後でスレッドを再割り込みできます。Uninterruptibles.sleepUninterruptiblyこれの実装については、guava's を参照してください。

スレッドの割り込みステータスをクリアしないことで、コードが割り込みを使用している可能性のある他のものに干渉するのを防ぎます。したがって、将来スレッドを中断したい場合でも、機能する場合と機能しない場合があるあいまいなバグが発生することはありません。

割り込みをまったく使用しない場合は、完全に無視することもできますが、万が一に備えて柔軟性を維持することをお勧めします。

于 2012-11-29T16:22:57.310 に答える