是否有一种强制停止Java线程的好方法?

Use*_*034 11 java multithreading

我想立即停止Java线程,但是当我尝试线程时,总是需要一些时间才能停止.是否有一种强制Java线程立即停止的好方法?

Ste*_*n C 18

没有好办法立即停止线程.

  • Thread.stop(),但它是危险的和弃用.不要使用它,除非:

    1. 你完全理解这些问题,并且

    2. 您已彻底分析了您的代码,并确定问题不适用和/或风险可以接受.

  • Thread.interrupt(),但不能保证线程会快速停止,甚至根本停止.行为将取决于应用程序线程代码是否已设计为通知并正确响应中断.

  • 有一种编写线程来定期检查标志的方法,但如果不经常检查标志(意外或设计),则线程不会快速停止.


FWIW,旗帜和interrupt()方法大致相同.在这两种情况下,期望被中断的线程需要定期检查; 例如,通过调用interrupted()isInterrupted()通过检查标志.

这些方法之间的区别在于,interrupt()当代码notify()在I/O操作中等待或阻塞时,该机制将起作用.因此,并且因为这interrupt是一种可接受的独立于应用程序的方式,所以通常优选应用程序特定flag机制.


six*_*ude 9

有一种安全(快速)强制停止线程的好方法:

System.exit(0)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这具有杀死所有其他线程的副作用

  • 我不确定要投票(是巨魔)还是投票(因为技术上正确) (8认同)
  • 我不认为 stackoverflow 的答案是开玩笑的地方,这不是喜剧网站,请将这些保留在评论部分。通过给出一个不认真的回答,你实际上是在浪费访问者的时间,他们期望得到一个认真的回答,从而降低了整个网站的真正使命。 (3认同)
  • 在我的测试中,甚至 System.exit(0) 并不总是关闭应用程序 (3认同)
  • 即使这种方法也不完全安全,这取决于您的应用程序。如果您有其他线程应该在关闭之前(之前)将它们拥有的数据存储在内存中,则System.exit(0)调用不会触发此存储行为。@StephenC你让我笑了,+ 1。 (2认同)
  • 这是我一生中在 stackoverflow 上找到的最“搞笑”的答案。我本来打算投反对票,但后来我完全同意@christian vielma (2认同)

Dea*_*mer 6

运行线程无法停止使用Thread.Interrupt,只能等待或阻塞线程可以使用Thread.Interrupt.But 停止使用共享变量来表示它应该停止它正在做的事情.线程应定期检查变量(例如:使用while循环)并以有序的方式退出.

private boolean isExit= false;

public void beforeExit() {
    isExit= true;
}

public void run() {
    while (!isExit) {

    }
}
Run Code Online (Sandbox Code Playgroud)


kit*_*yst 5

在任何情况下都不要使用 Thread.stop - 如果您问这个问题,那么您对 ​​Java 线程模型的了解不足以安全地使用它。

好奇的细节在这里:Java Thread Primitive Deprecation

如果您非常擅长 Java 并发,那么您就会明白为什么永远不应该使用它,即使它在您自己的代码中是完全安全的,它也会使您的代码被其他人污染和无法使用。相反,您可能最终会使用布尔变量技巧或其他一些模式来告诉线程何时应该完成然后退出。

不要使用 Thread.stop。曾经。