繁体   English   中英

Java:从另一个线程中停止一个线程中的所有活动

[英]Java: stopping all activities in a thread from another thread

我有两个线程: AB

线程A有一个无限循环:

while ( true ) {
    // Do something
}

线程B正在监视我感兴趣的某些状态。 当状态改变时,我希望线程A停止任何进一步的执行。

以下解决方案是不够的(使用A中从B调用的方法将keepRunning设置为true ):

while ( keepRunning) {
    // Do something
}

我迫不及待要在线程A暂停之前执行循环的主体-我想中断循环中调用的方法的执行。

有没有办法实现上述功能?

您可以进行一些点修复,例如检查A循环中关键点的keepRunning 您还可以中断线程A ,它仅在调用任何引发InterruptedException方法时才对您有所帮助。

但是,您不能仅仅使线程A停止死在其轨道上,并且有充分的理由:这很容易造成死锁。 过去只有Thread.stopThread.suspend方法可以做到这一点,由于这些危险, 它们已被弃用 从Java 8开始,该方法引发UnsupportedOperationException

基本上,线程必须自行停止。 它可以在其他线程的请求下执行此操作(通过诸如keepRunning类的字段或通过中断进行通信),但是它必须这样做。 一个线程不能直接停止另一个线程。

您可以随时中断Thread,但是这只会触发InterruptedException,因此方法应对此进行检查。

您可以尝试停止线程,但是这是不安全的操作,因为它可能在任何时候发生,并且除非您非常小心,否则可能会使内存处于不一致状态。 如果您要非常小心,则最好添加一些检查并尽早停止代码。

这是一个非常糟糕的主意,因为当打开关键资源(例如文件)时会发生什么? 它不会关闭:

while (keepRunning) {
    openFile();
    // gets stopped here
    closeFile();
}

当然,这也可能发生在其他方面,如OS进程,网络套接字等。 您明白为什么这是一个坏主意吗?

相反,您应该重新设计循环中的代码,以更频繁地检查条件,如果条件不再成立,则中断并清除。

while (keepRunning) {
    openFile();
    doLongOperation();
    if (!keepRunning) {
        closeFile();
        break; // or return
    }
    doAnotherLongOperation();
    closeFile();
}

这样,您就不会失去安全性,却能够更快地停止安全。

您可能实际上并没有使用宝贵的资源,但是无论如何您都应该告诉我们更多细节,以便我们给出更准确的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM