Java 终止无响应线程

Java 终止无响应线程,java,multithreading,concurrency,luaj,Java,Multithreading,Concurrency,Luaj,我已经构建了一个java应用程序,当按下一个按钮时,有一个线程在后台做一些事情。问题是,线程可能会被锁定,这可能是由于一个无限循环。有没有办法强制终止该线程 编辑:我正在java平台上使用LuaJ。它具有锁定的潜力,除了在另一个线程中运行它并在java或脚本完成时杀死它之外,我对它没有太多控制权。不,没有。如果没有主要的巫术,您唯一的选择就是调用interrupt(),然后等待它发出阻塞调用。此时,它将抛出一个InterruptedException,您应该终止该线程 如果它在循环中,例如whi

我已经构建了一个java应用程序,当按下一个按钮时,有一个线程在后台做一些事情。问题是,线程可能会被锁定,这可能是由于一个无限循环。有没有办法强制终止该线程


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

不,没有。如果没有主要的巫术,您唯一的选择就是调用interrupt(),然后等待它发出阻塞调用。此时,它将抛出一个InterruptedException,您应该终止该线程

如果它在循环中,例如
while(1)你真的做不了多少;您需要修复您的线程,使其不执行此操作,或者至少检查一个标志并停止自身

例如,您可以重写:

while(1) {
    doWork();
}
作为:

过去有一种方法可以做到这一点,但由于非常非常好的原因,它被弃用,因此不应使用

编辑: 因为您运行的可能是一个解释器,所以您需要做的是在执行每个语句(大约)后挂接,并检查magic
stop
变量,如果是,则终止Lua执行。或者,Lua运行时可能有自己的“terminate”标志,您可以使用它-我查找了文档,但它们的站点很糟糕,因此您可能需要查看代码


除此之外,您可能需要手动修补Lua4j源代码以添加此功能。您的选择非常有限,最终线程必须以某种方式控制自己的命运。

最后,随着Java V5.0(或V1.5)的发布,可以给出一个明确的答案。答案是使用停止线程。

问题是,这不是java代码锁定的问题。这是此软件的潜在用户将使用的脚本语言。如果他们决定在第(1)段期间写作;然后点击停止按钮,我需要能够终止该线程。+1回答得很好。线程陷入无限循环的问题很难处理,并且会导致线程管理的大问题。必须解决这些问题,以便线程永远不会进入无限循环。如果必须从外部控制线程,则必须间歇性地进行检查,以查看它们是否应该停止。@Dave:在每行执行之间,是否可以让线程检查一个运行状态变量,如@Steven的布尔停止变量,并在设置后优雅地退出线程?我将更改第二个
doWork()
to
doALittleWork()
强调工作应该分解为小的工作增量,在这些增量之间检查停止标志。@Erick:我在描述中提供了更多细节。我不认为我有能力做到这一点。是的,史蒂文已经说过这是一个选择。但是,如果线程不执行会引发此异常的代码,则没有什么好处。实际上,
thread.interrupt()
一直存在,而且它的语义自早期以来没有太大变化。正如Steven指出的,如果线程不执行任何阻塞等待或使用
isInterrupted()
显式检查,那么这将没有帮助。
class Whatever {
    private volatile boolean stop = false;
    ...
        while (!stop) {
            doALittleWork();
        }
    ...
}