我已经构建了一个java应用程序,并且有一个线程可以在按下按钮时在后台执行某些操作。问题是,该线程可能会锁定,可能是由于无限循环。有没有办法可以强制终止该线程?
编辑:我在java平台上使用LuaJ。它具有锁定的潜力,除了在另一个线程中运行它并且在java或脚本完成时杀死它时,我对它没有多少控制权。答案 0 :(得分:6)
不,没有。没有重大巫术的唯一选择是在其上调用interrupt()并等待它进行阻塞调用。此时,它将抛出一个InterruptedException,您应该终止该线程。
如果它处于诸如while(1);
之类的循环中,那么你真的不能做太多事情;你需要修复你的线程,不要这样做,或者至少检查一个标志并自行停止。
例如,您可以重写:
while(1) {
doWork();
}
为:
class Whatever {
private volatile boolean stop = false;
...
while (!stop) {
doALittleWork();
}
...
}
曾经有一个Thread.stop()
方法可以做到这一点但是由于非常好的原因而被弃用,不应该使用。
修改强>
由于您可能正在运行解释器,因此您需要做的是在每个语句执行后(或左右)挂钩并检查您的魔术stop
变量,如果是,则终止Lua执行。或者,Lua运行时可能有自己的“终止”标志,你可以使用 - 我查找文档,但他们的网站很糟糕,所以你可能需要查看代码。
除此之外,您可能需要手动修补Lua4j源以添加此功能。你的选择非常有限,最终Thread必须以某种方式控制自己的命运。
答案 1 :(得分:0)
最后,随着包含java.util.concurrent的Java V5.0(或V1.5)的发布,可以给出明确的答案。答案是您使用interrupt()停止线程。