我有一个方法在执行Groovy脚本后返回HTTP响应。我创建了一个应该执行Groovy脚本的匿名线程。但是,作为预防措施,我希望线程在3秒后停止,以防止坏脚本(即:无限循环)继续运行。
public Response runScript(String script) {
GroovyShell shell = new GroovyShell();
Thread thread = new Thread() {
public void run() {
Script validatedScript = shell.parse(script);
validatedScript.run();
}
};
thread.start();
thread.join(3000);
return Response.ok("It ran!", MediaType.TEXT_PLAIN).build();
}
此代码适用于没有无限循环的脚本。但是,如果存在无限循环,则响应"它运行!"被传递给客户端,但线程仍然存在。如何在join()
之后杀死此帖子?
答案 0 :(得分:1)
如果脚本不受信任并且您不能依赖它来表现良好,那么您就不能使用中断,这需要取消线程的合作(通过{{1}显式检查标志或者通过输入一个睡眠,等待或加入的调用(即使这样,代码也可能以无用的方式压制InterruptedException))。
您只能通过调用Thread#stop来终止它:
Thread.currentThread().isInterrupted
不推荐使用stop方法,因为它可以使终止线程的活动处于错误状态; ThreadDeath可以在任何地方抛出,因此没有好办法确保停止的线程在退出之前有机会进行清理。但是,由于此类情况,还没有从API中删除stop方法,并且此方法似乎不太可能很快被删除。
这里的弃用并不意味着“这个方法将在以后的版本中删除”为“危险,除非你知道你在做什么,否则不要使用它。”
答案 1 :(得分:0)
检查线程是否存活:
Thread thread = new Thread()
thread.join(3000)
if (thread.isAlive()) {
thread.interrupt()
// TODO
} else {
// TODO
}
答案 2 :(得分:0)
不幸的是,除非您的脚本中有阻塞操作,否则interrupt()
方法不会对您有所帮助。 interrupt()
方法仅在阻塞时才中断线程。
您无法像这样终止正在运行的线程。
您可以使用thread.isAlive()
方法检查线程是否仍然有效,但您无法阻止它。
我建议你尝试修改你的script.run()
,以便它最终结束,并且永远不会有无尽的线程工作