终止无响应的线程

时间:2010-09-27 19:22:54

标签: java multithreading concurrency luaj

我已经构建了一个java应用程序,并且有一个线程可以在按下按钮时在后台执行某些操作。问题是,该线程可能会锁定,可能是由于无限循环。有没有办法可以强制终止该线程?

编辑:我在java平台上使用LuaJ。它具有锁定的潜力,除了在另一个线程中运行它并且在java或脚本完成时杀死它时,我对它没有多少控制权。

2 个答案:

答案 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()停止线程。