有没有一种好方法可以强制停止Java线程?
我想立即停止Java线程,但是当我尝试线程时,线程总是需要一些时间才能停止。有没有一种好方法可以强制Java线程立即停止?
我想立即停止Java线程,但是当我尝试线程时,线程总是需要一些时间才能停止。有没有一种好方法可以强制Java线程立即停止?
没有立即停止线程的好方法。
有,但它是危险的和弃用的。请勿使用它,除非:Thread.stop()
你完全理解使它变得危险的问题,
您已经彻底分析了您的代码,并确定问题不适用和/或风险是可以接受的,并且
你不在乎你的应用程序可能最终卡在某个版本的Java上,如果/当方法被删除1。
有,但它同样危险2,弃用,并在Java 11中删除了3。Thread.stop(Throwable)
有,但不能保证线程会很快停止,甚至根本停止。该行为将取决于应用程序线程代码是否设计为注意到并正确响应中断。(见下文。Thread.interrupt()
有一种方法可以编写线程来定期检查标志;看到这个答案。(见下文。
“检查标志”和方法大致相同。在这两种情况下,预计中断的线程都需要定期检查;例如,通过呼叫或或检查标志。interrupt()
interrupted()
isInterrupted()
这些方法之间的区别在于,当代码等待 、 等或在 I/O 操作中被阻止时,该机制将起作用。因此,并且由于是一种与应用程序无关的可接受方式来执行此操作,因此通常比实现特定于应用程序的机制更可取。interrupt()
notify()
join()
interrupt
flag
1 - 在 Java 18 预发行版 javadocs 中,Thread.stop()
现在显示为“标记为要删除”。
2 - 可能更是如此。例如,如果你做了一个Thread.stop(new IOException()),
那么调用堆栈后面的一些代码可以很容易地捕获异常并破坏你的“stop”。
3 - 您仍然可以通过反射性地调用私有 Thread.stop0(Throwable)
方法来使用旧的“停止异常”功能;请参阅 https://stackoverflow.com/a/67077495/139985。最好避免这样做。
有一种安全(快速)强制停止线程的好方法:
System.exit(0)
不幸的是,这会产生杀死所有其他线程的副作用。