【发布时间】:2010-12-06 22:26:21
【问题描述】:
我需要知道会发生什么
- 什么时候睡觉?
- 当它运行时,即它正在执行给定的任务。
提前致谢。
【问题讨论】:
标签: java multithreading thread-safety
我需要知道会发生什么
提前致谢。
【问题讨论】:
标签: java multithreading thread-safety
中断一个线程是一种状态安全的方式来取消它,但是线程本身必须被编码来注意中断。如果在该线程执行时发生.interrupt(),则抛出InterruptedException 的长阻塞Java 操作将抛出该异常。
.interrupt() 方法为该线程设置“中断”标志并中断任何 IO 或睡眠操作。它什么都不做,因此由您的程序做出适当响应并定期通过Thread.interrupted() 检查其中断标志。
如果一个线程不检查中断,它就不能安全地停止。 Thread.stop() is unsafe to use. 所以你使用.interrupt() 来停止一个线程,但是在编写多线程代码时,你要确保.interrupt() 会做一些明智的事情。 This TechRepublic article is a pretty good tutorial.
【讨论】:
从您之前的问题来看,我假设您对 Java 的行为感兴趣。
在 Java 中,如果线程当前处于阻塞状态,则会抛出 InterruptedException。如果线程没有阻塞,则不会抛出异常。
更多信息,请看这里:
JavaDocs
对于 .NET 语言,如果线程当前处于阻塞状态,则会抛出 ThreadInterruptedException。如果线程没有阻塞,则在线程阻塞之前不会抛出异常。
请用您想要回答的语言标记您的问题。
【讨论】:
InterruptedException,以及 (2) 线程具有“中断状态”,如果线程未等待或休眠,则设置该“中断状态”。我不确定中断状态已经设置的阻塞是否会导致抛出异常,但它是不太可能破坏东西的选择。
还有一个值得分享的重要信息是,Thread Class 中有两个方法 isInterrupted() 和 interrupted()。后者是一种静态方法。 isInterrupted()方法调用不会改变Thread类的interrupted属性的状态,而interrupted()静态方法调用可以设置中断布尔值为假。
【讨论】: