首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:从另一个线程停止线程中的所有活动

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

Stack Overflow用户
提问于 2014-05-21 17:33:04
回答 3查看 62关注 0票数 0

我有两个线程:AB

线程A中有一个没完没了的循环

代码语言:javascript
复制
while ( true ) {
    // Do something
}

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

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

代码语言:javascript
复制
while ( keepRunning) {
    // Do something
}

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

是否有实现上述功能的方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-21 17:36:47

您可以做一些点修复,比如检查keepRunningA的循环中的关键点,还可以中断线程A,只有当它调用任何抛出InterruptedException的方法时才能帮助您。

但是,不能只让线程A停止运行,这是有原因的:这很容易陷入死锁。过去有一种方法Thread.stopThread.suspend就是这样做的,而他们已经被反对了正是因为这些危险。从Java 8开始,这个方法是UnsupportedOperationException

基本上,一个线程必须停止自己。它可以根据其他线程的请求(通过像keepRunning这样的字段或通过中断通信)这样做,但它必须这样做。一个线程不能直接阻止另一个线程。

票数 1
EN

Stack Overflow用户

发布于 2014-05-21 17:37:42

您可以在任何时候中断线程,但是这只会触发方法中的InterruptedException,应该对此进行检查。

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

票数 1
EN

Stack Overflow用户

发布于 2014-05-21 17:37:52

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

代码语言:javascript
复制
while (keepRunning) {
    openFile();
    // gets stopped here
    closeFile();
}

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

相反,您应该重新设计循环中的代码,以便更经常地检查条件,如果条件不再成立,则中断和清理。

代码语言:javascript
复制
while (keepRunning) {
    openFile();
    doLongOperation();
    if (!keepRunning) {
        closeFile();
        break; // or return
    }
    doAnotherLongOperation();
    closeFile();
}

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

你可能实际上没有使用宝贵的资源,但无论如何,你应该告诉我们更多的细节,这样我们才能给出一个更精确的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23790173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档