Java线程休眠和中断异常

时间:2013-03-20 15:40:33

标签: java multithreading exception sleep

  1. 为什么sleep线程需要try catch来捕获Interrupted Exception?
  2. 为什么睡眠会发出中断异常错误? 这是我在java编程中真正想要发现的两个问题 我一直在谷歌搜索,我还没有找到一个明确的解释是为什么这两件事发生。

6 个答案:

答案 0 :(得分:3)

当线程被阻塞/等待并且被另一个线程(通过InterruptedException)中断时,抛出Thread.interrupt。可以将其视为立即终止的请求,不会遇到Thread.stop()的缺点。

这样,即使您指示线程休眠几年,您也可以中断该线程。

InterruptedException被抛出时,

The recommended practice正在中止您处理的任何内容。

答案 1 :(得分:1)

1.-因为一个线程无法完成正常执行,如果你中断它,你需要抓住它以便做好准备。 2.-由于线程等待与中断线程不同,可以恢复线程等待,但中断线程已经完成执行。

答案 2 :(得分:1)

当您要求线程休眠时,该线程的预期行为是睡眠这么长时间。因此,如果睡眠中断,它将抛出InterruptedException以指示它无法完成任务。如果它被中断,你可能想要处理应该做的事情。

答案 3 :(得分:0)

有一个干净的例子说明如何在此处抛出中断异常:http://www.javamex.com/tutorials/threads/thread_interruption.shtml

此处讨论sleep()yield()http://www.coderanch.com/t/508657/threads/java/Sleep-Yield-state

答案 4 :(得分:0)

这是因为sleep()可能会永远阻止/很长时间,因此您需要一种方法来取消此行为。因为当您中断操作时不是“正常”完成,您可能需要执行某些特定的补偿或补救措施,例如,发送您从未收到过通知的警报,清理资源等。
有一个非常好的developer works article on the subject

答案 5 :(得分:0)

睡眠和中断在语义上无关。只是Java设计者认为当你想让你的线程休眠时,这是一个提醒你中断的好机会。这就像Duke“看起来你正在试图睡觉,你是否也希望通过确保它正确响应中断事件,当需要一个时,让你的线程成为一个好公民在项目的后期阶段突然终止它的方法出现了?“

所以人们经常会看到这样的代码:

try {
    Thread.sleep(1000);
} catch (InterruptedException ie) {
    //Don't worry about it.
}

有时人们说这被认为是不好的做法。但是如果你不打算在你的程序中使用中断工具,那么这些异常将永远不会抛出,所以你必须问自己是否做了额外的工作以便处理这些异常,以防你决定添加一段时间后程序的可中断功能是有道理的。这是Java设计者坚持认为每个线程应该做的事情之一 - 你可以interrupt()它,它会快速而干净地中止它正在做的事情。我认为在许多情况下这是不必要的,但人们会查看你的代码,看到这一点,仍然说“eew,bad practice!”

The official Java tutorial explains interrupts。基本上,如果你有一个线程t进行一些处理,然后用户想要取消它,你可以从另一个线程调用t.interrupt()。在线程t上运行的代码中,只要sleep() s或wait() s等,就会抛出InterruptedException。如果它没有做任何这些,那么它(也应该)也可以(不应该)使用Thread.interrupted()不时地查明它是否被中断。在所有这些发现中断的方法中,它应该放弃它正在做的事情并尽快清理。 (也就是说:如果它这样做,那么这种行为可能对你或某人有用 - 这就是中断的想法。)

因此,Java将此作为sleep(..)方法的检查异常,迫使您考虑使用此工具。理由的另一部分是如果 sleep(..)被中断,那么它会提前醒来,这是一个例外事件。 (但请记住,“if”。)

重要的是,中断不会无缘无故地发生。如果您编写代码来实现它们,或者如果其他人这样做,那么它们就会发生,它们会启动您的线程并且需要取消它们的活动。所以这是导致Thread.sleep(..)抛出InterruptedException的人。你做。如果你不这样做,那么你仍然需要抓住它。

编辑。顺便说一句,这样做会更好:

try {
    Thread.sleep(1000);
} catch (InterruptedException ie) {
    throw new UnsupportedOperationException("Interrupts not supported.", ie);
}

所以,如果您或其他人曾试图在以后错误地中断此线程,那么当他们去测试时,会提醒他们这个功能没有实现。 (UnsupportedOperationExceptionRuntimeException的子类,因此未经检查。)