Java 终止无响应线程
我已经构建了一个java应用程序,当按下一个按钮时,有一个线程在后台做一些事情。问题是,线程可能会被锁定,这可能是由于一个无限循环。有没有办法强制终止该线程Java 终止无响应线程,java,multithreading,concurrency,luaj,Java,Multithreading,Concurrency,Luaj,我已经构建了一个java应用程序,当按下一个按钮时,有一个线程在后台做一些事情。问题是,线程可能会被锁定,这可能是由于一个无限循环。有没有办法强制终止该线程 编辑:我正在java平台上使用LuaJ。它具有锁定的潜力,除了在另一个线程中运行它并在java或脚本完成时杀死它之外,我对它没有太多控制权。不,没有。如果没有主要的巫术,您唯一的选择就是调用interrupt(),然后等待它发出阻塞调用。此时,它将抛出一个InterruptedException,您应该终止该线程 如果它在循环中,例如whi
编辑:我正在java平台上使用LuaJ。它具有锁定的潜力,除了在另一个线程中运行它并在java或脚本完成时杀死它之外,我对它没有太多控制权。不,没有。如果没有主要的巫术,您唯一的选择就是调用interrupt(),然后等待它发出阻塞调用。此时,它将抛出一个InterruptedException,您应该终止该线程 如果它在循环中,例如
while(1)代码>你真的做不了多少;您需要修复您的线程,使其不执行此操作,或者至少检查一个标志并停止自身
例如,您可以重写:
while(1) {
doWork();
}
作为:
过去有一种方法可以做到这一点,但由于非常非常好的原因,它被弃用,因此不应使用
编辑:
因为您运行的可能是一个解释器,所以您需要做的是在执行每个语句(大约)后挂接,并检查magicstop
变量,如果是,则终止Lua执行。或者,Lua运行时可能有自己的“terminate”标志,您可以使用它-我查找了文档,但它们的站点很糟糕,因此您可能需要查看代码
除此之外,您可能需要手动修补Lua4j源代码以添加此功能。您的选择非常有限,最终线程必须以某种方式控制自己的命运。最后,随着Java V5.0(或V1.5)的发布,可以给出一个明确的答案。答案是使用停止线程。问题是,这不是java代码锁定的问题。这是此软件的潜在用户将使用的脚本语言。如果他们决定在第(1)段期间写作;然后点击停止按钮,我需要能够终止该线程。+1回答得很好。线程陷入无限循环的问题很难处理,并且会导致线程管理的大问题。必须解决这些问题,以便线程永远不会进入无限循环。如果必须从外部控制线程,则必须间歇性地进行检查,以查看它们是否应该停止。@Dave:在每行执行之间,是否可以让线程检查一个运行状态变量,如@Steven的布尔停止变量,并在设置后优雅地退出线程?我将更改第二个doWork()
todoALittleWork()
强调工作应该分解为小的工作增量,在这些增量之间检查停止标志。@Erick:我在描述中提供了更多细节。我不认为我有能力做到这一点。是的,史蒂文已经说过这是一个选择。但是,如果线程不执行会引发此异常的代码,则没有什么好处。实际上,thread.interrupt()
一直存在,而且它的语义自早期以来没有太大变化。正如Steven指出的,如果线程不执行任何阻塞等待或使用isInterrupted()
显式检查,那么这将没有帮助。
class Whatever {
private volatile boolean stop = false;
...
while (!stop) {
doALittleWork();
}
...
}