这种睡眠实施有什么问题吗?

时间:2012-11-29 16:15:33

标签: java multithreading exception

很长一段时间以来,我一直在使用以下函数让当前线程休眠一段时间:

class Utils {

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

}

但是因为我很容易忽略异常,我想知道是否会出现这种情况会变成邪恶的情况?

1 个答案:

答案 0 :(得分:7)

如果您没有在自己的代码中使用中断,则应将中断状态保持为:

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

或者你可以通过投掷InterruptedException来更高层次地处理它。这会立即让调用者知道有一个中断,否则可以在以后使用isInterrupted()进行检查。

如果您必须全天休眠,那么您可以在中断后继续休眠,然后重新中断线程。请参阅guava的Uninterruptibles.sleepUninterruptibly以了解此实现。

如果不清除线程的中断状态,则会阻止代码干扰可能正在使用中断的任何其他内容。因此,如果将来你想要中断一个线程,你就不会有一些模糊的错误,有时候它会起作用,有时却没有。

如果你永远不会使用中断,可能会完全忽略它,但为了以防万一,保持灵活性是很好的。