Java线程hibernate和中断exception

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

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

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

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

建议的做法是在抛出InterruptedException时中止正在处理的任何内容。

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

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

这里讨论一下sleep()yield() : http : //www.coderanch.com/t/508657/threads/java/Sleep-Yield-state

这是因为sleep()可能会永远阻塞/很长时间,所以你需要一种方法来取消这种行为。 因为当您中断操作时不是“正常”完成,您可能需要执行某些特定的补偿或补救措施,例如,发送您从未收到过通知的警报,清理资源等。
关于这个主题有一篇非常好的开发者作品 。

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

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

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

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

官方Java教程解释了中断 。 基本上,如果你有一个线程做了一些处理,然后用户想要取消它,你可以从另一个线程调用t.interrupt() 。 在线程t上运行的代码中,无论何时sleep() s或wait() s等,都会抛出InterruptedException 。 如果它没有执行任何这些操作,那么它(也应该)还可以查看是否已经不时使用Thread.interrupted()中断它。 在所有这些发现中断的方法中,它应该放弃它正在做的事情并尽快清理。 (也就是说:如果它这样做,那么这种行为可能对你或某人有用 – 这就是中断的想法。)

所以,Java使这成为sleep(..)方法的一个检查exception,迫使你考虑使用这个工具。 理由的另一部分是, 如果 sleep(..)中断,那么它会提早醒来,这是一个例外事件。 (但请记住,那就是“如果” 。)

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


编辑。 顺便说一下,这样做是更好的做法:

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

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