Java 为什么';在Thread.interrupt不';不行?
Sun Oracle在Java 为什么';在Thread.interrupt不';不行?,java,multithreading,Java,Multithreading,Sun Oracle在Thread.stop()上的官方立场是不应该使用它。在其他论点中: 应该注意的是,在等待线程不响应thread.interrupt的所有情况下,它也不会响应thread.stop 但我不明白这一点。如果线程正在积极地处理某些事情(不仅仅是等待或阻塞外部资源),并且没有显式地检查中断标志,那么thread.interrupt()不会在thread.stop()仍能工作时执行任何操作(throwThreadDeath)?如果JVM太忙而无法中断线程,据我所知,主要原因是Thr
Thread.stop()
上的官方立场是不应该使用它。在其他论点中:
应该注意的是,在等待线程不响应thread.interrupt的所有情况下,它也不会响应thread.stop
但我不明白这一点。如果线程正在积极地处理某些事情(不仅仅是等待或阻塞外部资源),并且没有显式地检查中断标志,那么
thread.interrupt()
不会在thread.stop()
仍能工作时执行任何操作(throwThreadDeath
)?如果JVM太忙而无法中断线程,据我所知,主要原因是ThreadDeath异常可能会在任何地方抛出,而interupt标志必须明确检查
考虑以下在线程中运行的代码:
public void sellItem(Store s) {
synchronized (s) {
if (s.itemsAvailable > 0) {
s.itemsAvailable--;
s.itemsSold++;
}
}
}
如果在s.itemsAvailable--
之后抛出ThreadDeath,则存储对象将处于不一致状态。另一方面,此代码是安全的:
public void sellLoop(Store s) {
while (!Thread.interrupted())
sellItem(s);
}
资料来源:
他们说Thread.stop()
不起作用,因为(我猜)可以捕获并忽略丢弃的内容
但我不明白这一点。如果一个线程正在积极地处理某些事情(不仅仅是等待或阻塞外部资源),并且没有显式地检查中断标志,那么当thread.stop()仍能工作时,thread.interrupt()会不会什么都不做(抛出ThreadDeath)
我想你误解了引用的文本。它指的是正在等待的线程,而不是正在运行的线程。具体而言,它指的是以下情况:
- 当线程在I/O调用中被阻塞时,低级JVM实现问题会阻止它响应
或停止
中断
- 不希望被停止的线程可以捕获
,这类似于不希望被中断的线程忽略标志ThreadDeath
SIGUSR2
(例如)不能帮助本机代码跳出,那么它也不能帮助中断/停止。
你可以这样想中断和停止:两者都可能使用操作系统信号。本机代码可能不支持操作系统信号。但是,如果是:stop()也会在堆栈上放置一个Throwable,该堆栈将在java代码中传播。相反,中断只设置一个标志 然而,几乎在任何语句中都可能弹出throwable,因此某些不变量可能无法正确处理
可能,通过Thread.uncaughtExceptionHandler可以部分修复它,方法是丢弃大型状态、回滚事务等。。。同样:不建议。
线程.stop()
--。我更正了问题中的链接,以指向包含引号的实际文档。@Nishant我试图做的是与之相关的。我欢迎任何不依赖于Thread.stop()的解决方案,但我想不出任何不需要字节码操作的解决方案。这就是我考虑Thread.stop()的原因,我试图更好地理解使用它的含义。我没有上下文。如果你把这个问题链接到这里就好了,那是错误的。在多核机器上,可能有一个单线程在循环中运行,不能简单地中断,因为它没有对它进行任何操作检查。不想停止的线程可以捕获ThreadDeath,这类似于不想被中断的线程忽略标志。只需要更积极地使用Thread.stop(),也就是说,在挡块周围敲击就可以了。还有其他一些丑恶的把戏可以把一根行为不端的线踢进坚果里,但它们不在范围之内;谢谢你澄清这一点。“你可以这样想中断与停止:两者都可能使用操作系统信号[…]stop()也会在堆栈上放置一个可丢弃的”—非常好的低级别差异措辞,谢谢!