Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';在Thread.interrupt不';不行?_Java_Multithreading - Fatal编程技术网

Java 为什么';在Thread.interrupt不';不行?

Java 为什么';在Thread.interrupt不';不行?,java,multithreading,Java,Multithreading,Sun Oracle在Thread.stop()上的官方立场是不应该使用它。在其他论点中: 应该注意的是,在等待线程不响应thread.interrupt的所有情况下,它也不会响应thread.stop 但我不明白这一点。如果线程正在积极地处理某些事情(不仅仅是等待或阻塞外部资源),并且没有显式地检查中断标志,那么thread.interrupt()不会在thread.stop()仍能工作时执行任何操作(throwThreadDeath)?如果JVM太忙而无法中断线程,据我所知,主要原因是Thr

Sun Oracle在
Thread.stop()
上的官方立场是不应该使用它。在其他论点中:

应该注意的是,在等待线程不响应thread.interrupt的所有情况下,它也不会响应thread.stop


但我不明白这一点。如果线程正在积极地处理某些事情(不仅仅是等待或阻塞外部资源),并且没有显式地检查中断标志,那么
thread.interrupt()
不会在
thread.stop()
仍能工作时执行任何操作(throw
ThreadDeath
)?

如果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
    ,这类似于不希望被中断的线程忽略标志


Thread.stop不是一个关于能够跳出线程的编码好坏的问题。 除非万不得已,否则你不应该使用它。您可以编写代码并期望Thread.stop()出现,但在这种情况下,interrupt()也可以做得很好

当interrupt()不起作用时,stop()将不起作用(即在某些本机内容上被阻止):stop和ineterrupt将使用相同的本机信号来进行调用

在POSIX上,如果
SIGUSR2
(例如)不能帮助本机代码跳出,那么它也不能帮助中断/停止。
你可以这样想中断和停止:两者都可能使用操作系统信号。本机代码可能不支持操作系统信号。但是,如果是:stop()也会在堆栈上放置一个Throwable,该堆栈将在java代码中传播。相反,中断只设置一个标志

然而,几乎在任何语句中都可能弹出throwable,因此某些不变量可能无法正确处理


可能,通过Thread.uncaughtExceptionHandler可以部分修复它,方法是丢弃大型状态、回滚事务等。。。同样:不建议。

线程.stop()
--。我更正了问题中的链接,以指向包含引号的实际文档。@Nishant我试图做的是与之相关的。我欢迎任何不依赖于Thread.stop()的解决方案,但我想不出任何不需要字节码操作的解决方案。这就是我考虑Thread.stop()的原因,我试图更好地理解使用它的含义。我没有上下文。如果你把这个问题链接到这里就好了,那是错误的。在多核机器上,可能有一个单线程在循环中运行,不能简单地中断,因为它没有对它进行任何操作检查。不想停止的线程可以捕获ThreadDeath,这类似于不想被中断的线程忽略标志。只需要更积极地使用Thread.stop(),也就是说,在挡块周围敲击就可以了。还有其他一些丑恶的把戏可以把一根行为不端的线踢进坚果里,但它们不在范围之内;谢谢你澄清这一点。“你可以这样想中断与停止:两者都可能使用操作系统信号[…]stop()也会在堆栈上放置一个可丢弃的”—非常好的低级别差异措辞,谢谢!