Java线程睡眠和追访异常(Java Thread Sleep and Interrupted Ex

2019-08-17 18:54发布

  1. 为什么睡眠线程需要一个尝试捕捉赶上追访异常?
  2. 为什么睡眠甚至发出中断异常错误? 这是两个问题,我真的想了解Java编程我一直在通过谷歌搜索和我一直还没有找到一个明确的解释,为什么这会发生两两件事。

Answer 1:

1.-因为线程不能完成其正常运行,如果你中断它,你需要捕捉,为了准备做一些事情。 2:由于一个线程等待,就是从中断线程不同,一个线程等待就可以恢复,但中断线程已完成执行。



Answer 2:

一个InterruptedException当线程被阻塞,则抛出/等待,它是由另一个线程中断(借助于Thread.interrupt )。 把它看成是立即终止的请求,不吃亏的缺点, Thread.stop()

这样一来,即使你指示线程几年来睡觉,你能够中断一个线程。

建议的做法是中止时,无论你正在处理InterruptedException被抛出。



Answer 3:

当你问一个线程来睡觉,因为该线程预期的行为是睡了那么多时间。 因此,如果睡眠被中断,它会抛出InterruptedException,以表明它无法完成的任务。 你可能要采取的,如果它被中断应该怎样做护理。



Answer 4:

还有就是如何中断的异常都可以在这里抛出一个清晰的例子: http://www.javamex.com/tutorials/threads/thread_interruption.shtml

而关于讨论sleep()yield()在这里: http://www.coderanch.com/t/508657/threads/java/Sleep-Yield-state



Answer 5:

这是因为sleep()所以你需要一种方法能够消除这种行为可能永远阻塞/很长一段时间。 因为它不是“正常”完成时,中断动作,你可能需要执行一些特定的补偿或补救措施,例如,送你从未收到通知的警报,清理资源,等等。
有一个很好的开发者合作,文章的主题 。



Answer 6:

睡眠和中断语义不相关。 这只是Java的设计者认为,当你想你的线程睡眠,这是提醒你中断的好机会。 这就像杜克说:“它看起来像你想睡觉,也愿意让你的线程通过确保一个好公民,它响应正确中断事件,当需要一种方式来得到它的突然终止在项目后期阶段出现?”

所以,一个经常会看到这样的代码:

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

有时候人们会说这被认为是不好的做法。 但是,如果你不打算使用中断设施在你的程序,那么这些异常将永远不会被抛出,那么你要问自己是否做额外的工作,为了照顾这些例外的,如果你决定添加在中断性功能,你的程序一段时间后,才有意义。 这是其中的一件事情是Java的设计者坚持认为,每个线程应该做的-你可以interrupt()它,它会很快就会完全放弃它在做什么。 我认为这是在许多情况下是不必要的,但人们会看你的代码,看到这一点,还是说“EEW,不好的做法!”

官方的Java教程介绍中断 。 基本上,如果你有一个线程t做一些处理,然后将用户想要取消它,从另一个线程,你会叫t.interrupt() 在对线程运行的代码t ,每当sleep() S,或wait() S等,一个InterruptedException将被抛出。 如果它没有做任何的这些话,就可以(应该)也发现,如果它一直在使用中断Thread.interrupted()不时。 在发现关于中断的所有这些方面,应该抛弃它在做什么,并尽快清理。 (也就是说:如果是这样的话,那么这种行为可能对你或有用的人 - 这是中断的想法)

所以,Java使得这个的检查异常sleep(..)方法,迫使你去思考有关使用该工具。 理的另一部分是, 如果 sleep(..)被中断,那么它会早起,这是一个特殊的事件。 (但是,请记住,有“如果”。)

重要的是,中断不只是发生没有理由。 他们发生,如果你写的代码,使它们发生,或者如果别人做,谁启动您的线程,并有必要取消其活动。 因此,这是谁造成Thread.sleep(..)抛出一个InterruptedException 。 你做。 如果你不这样做,那么你仍然需要抓住它。


编辑。 顺便说一句,这将是一个更好的做法,做这种方式:

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

所以,如果你或其他人,不断尝试后中断这个线程错误,那么当他们去测试它,他们就会提醒的是,此功能尚未实现。 ( UnsupportedOperationException是的子类RuntimeException ,所以它的选中。)



文章来源: Java Thread Sleep and Interrupted Exception