我有两个帖子:A
和B
。
线程A
中有无限循环:
while ( true ) {
// Do something
}
线程B
正在监视某些我感兴趣的状态。当状态改变时,我希望线程A
停止任何进一步的执行。
以下解决方案是不够的(使用从keepRunning
调用的true
中的方法将A
设置为B
:
while ( keepRunning) {
// Do something
}
我不能等待在线程A
停止之前执行循环体 - 我希望循环中调用的方法的执行被中断。
有没有办法实现上述功能?
答案 0 :(得分:1)
您可以执行一些点修复,例如在keepRunning
循环中的关键点检查A
。你也可以中断线程A
,它只会在调用任何抛出InterruptedException
的方法时帮助你。
但你不能让线程A停在其轨道上,并且有充分的理由:这将容易陷入僵局。曾经有一种方法Thread.stop
和Thread.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();
}
这样,你就不会失去安全感,同时能够更快地停止安全。
您可能实际上并未使用宝贵的资源,但无论如何您应该告诉我们更多详细信息,以便我们提供更准确的答案。