2011-03-09 80 views
6

我想立即停止Java线程,但是当我尝试线程停止之前总是需要一些时间。 有没有一种强制Java线程立即停止的好方法?有没有一种强制停止Java线程的好方法?

+0

取决于要求。那么,你可以立即停止使用中断() –

+0

@Mohamed Saligh:我使用相同的。但花时间停止线程。我可以在我的服务器控制台上看到该进程。 –

+0

请在下面寻找答案.. –

回答

3

运行线程无法使用Thread.Interrupt停止,只能使用Thread.Interrupt停止等待或阻塞线程。但使用共享变量来表示它应该停止正在执行的操作。线程应定期检查变量(例如:使用while循环)并按顺序退出。

private boolean isExit= false; 

public void beforeExit() { 
    isExit= true; 
} 

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

    } 
} 
12

没有什么好的方法来立即停止线程。

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

    1. 你完全明白的问题,

    2. 你有彻底分析你的代码,并确定该问题不适用和/或风险是可以接受的。

  • Thread.interrupt(),但不保证线程会迅速停止,甚至都停止。

  • 有写入线程定期检查标志的方法,但是如果标志没有经常检查(意外或通过设计),则线程不会很快停止。


FWIW,标志和interrupt()方法在本质上是相同的。在这两种情况下,期望中断的线程都需要定期检查;例如通过调用interrupted()isInterrupted()或通过检查一个标志。区别在于interrupt()机制将在代码正在等待notify()或阻塞和IO操作时起作用。因此,并且因为interrupt是一种独立于应用程序的方式,所以应优先使用它,而不是应用程序特定的机制。

+0

此外,如果您想使用使用Java基础结构的标志方法,则可以使用'Thread.currentThread.isInterrupted'。 – sixtyfootersdude

+0

@sixtyfootersdude - 我相信我已经说过了。 –

1

不要在任何情况下使用Thread.stop - 如果你问这个问题,那么你不明白Java线程模型足以安全地使用它。

的细节,为好奇,在这里:http://download.java.net/jdk7/archive/b131/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

如果你在Java并发真的够好,那么你就会明白为什么你不应该使用它,即使它的内完全安全的自己的代码,它会让你的代码被其他人污染和无法使用。相反,您最终可能会使用布尔变量技巧或某种其他模式来告诉线程何时完成并退出。

不要使用Thread.stop。永远。

+0

我几乎允许我在链接上使用Thread.stop()thx! –

4

有一个好办法安全(和快速)强行停止一个线程:

System.exit(0) 

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

+17

拉出电源线也是如此:-) –

+0

虽然我不会在数据中心建议这样做:-) –

+1

这是一个不好的答案,它会杀死我所有的线程! – HDJEMAI

相关问题