[英]Java: stopping all activities in a thread from another thread
我有两个线程: A
和B
线程A
有一个无限循环:
while ( true ) {
// Do something
}
线程B
正在监视我感兴趣的某些状态。 当状态改变时,我希望线程A
停止任何进一步的执行。
以下解决方案是不够的(使用A
中从B
调用的方法将keepRunning
设置为true
):
while ( keepRunning) {
// Do something
}
我迫不及待要在线程A
暂停之前执行循环的主体-我想中断循环中调用的方法的执行。
有没有办法实现上述功能?
您可以进行一些点修复,例如检查A
循环中关键点的keepRunning
。 您还可以中断线程A
,它仅在调用任何引发InterruptedException
方法时才对您有所帮助。
但是,您不能仅仅使线程A停止死在其轨道上,并且有充分的理由:这很容易造成死锁。 过去只有Thread.stop
和Thread.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.