我有两个线程:A和B。
线程A中有一个没完没了的循环
while ( true ) {
// Do something
}线程B正在监视我感兴趣的一些状态。当状态发生变化时,我希望线程A停止任何进一步的执行。
以下解决方案是不够的(将keepRunning设置为true,在A中使用从B调用的方法):
while ( keepRunning) {
// Do something
}我不能等到线程A停止之前执行循环的主体&我希望循环中调用的方法的执行被中断。
是否有实现上述功能的方法?
发布于 2014-05-21 17:36:47
您可以做一些点修复,比如检查keepRunning在A的循环中的关键点,还可以中断线程A,只有当它调用任何抛出InterruptedException的方法时才能帮助您。
但是,不能只让线程A停止运行,这是有原因的:这很容易陷入死锁。过去有一种方法Thread.stop和Thread.suspend就是这样做的,而他们已经被反对了正是因为这些危险。从Java 8开始,这个方法是UnsupportedOperationException。
基本上,一个线程必须停止自己。它可以根据其他线程的请求(通过像keepRunning这样的字段或通过中断通信)这样做,但它必须这样做。一个线程不能直接阻止另一个线程。
发布于 2014-05-21 17:37:42
您可以在任何时候中断线程,但是这只会触发方法中的InterruptedException,应该对此进行检查。
您可以尝试停止一个线程,但是,这是一个不安全的操作,因为它可能发生在任何一点,除非您非常小心,这可能使内存处于不一致的状态。如果您要如此小心,您还可以添加一些检查,并尽早停止代码。
发布于 2014-05-21 17:37:52
这是一个非常糟糕的主意,因为当关键资源打开时会发生什么,比如一个文件?它不会关闭的:
while (keepRunning) {
openFile();
// gets stopped here
closeFile();
}当然,这也可以发生在其他事情,操作系统进程,网络套接字,任何事情。你知道为什么这是个坏主意吗?
相反,您应该重新设计循环中的代码,以便更经常地检查条件,如果条件不再成立,则中断和清理。
while (keepRunning) {
openFile();
doLongOperation();
if (!keepRunning) {
closeFile();
break; // or return
}
doAnotherLongOperation();
closeFile();
}这样,你就不会失去安全,同时能够更快地阻止它。
你可能实际上没有使用宝贵的资源,但无论如何,你应该告诉我们更多的细节,这样我们才能给出一个更精确的答案。
https://stackoverflow.com/questions/23790173
复制相似问题