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

时间:2014-05-21 17:33:05

标签: java multithreading

我有两个帖子:AB

线程A中有无限循环:

while ( true ) {
    // Do something
}

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

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

while ( keepRunning) {
    // Do something
}

我不能等待在线程A停止之前执行循环体 - 我希望循环中调用的方法的执行被中断。

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

3 个答案:

答案 0 :(得分:1)

您可以执行一些点修复,例如在keepRunning循环中的关键点检查A。你也可以中断线程A,它只会在调用任何抛出InterruptedException的方法时帮助你。

但你不能让线程A停在其轨道上,并且有充分的理由:这将容易陷入僵局。曾经有一种方法Thread.stopThread.suspend就是这样做的,而they've been deprecated则是因为这些危险。从Java 8开始,该方法throws UnsupportedOperationException

基本上,线程必须自行停止。它可以在其他线程的请求下执行(由keepRunning或中断等字段传送),但它必须这样做。一个线程不能直接阻止另一个线程。

答案 1 :(得分:1)

你可以在任何时候中断线程,但是这只会触发方法中的InterruptedException来检查它。

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

答案 2 :(得分:1)

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

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

这当然可以与其他事情一起发生,操作系统进程,网络套接字,任何东西。你知道为什么这是一个坏主意吗?

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

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

这样,你就不会失去安全感,同时能够更快地停止安全。

您可能实际上并未使用宝贵的资源,但无论如何您应该告诉我们更多详细信息,以便我们提供更准确的答案。