我有一个方法在执行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()之后终止此线程?
最佳答案 如果脚本不受信任并且您不能依赖它来表现良好,那么您就不能使用中断,这需要线程的合作被取消(通过使用Thread.currentThread()显式检查标志.isInterrupted或者通过输入一个睡眠,等待或加入的调用(即使这样,代码也可能以无用的方式压制InterruptedException)).
你只能通过调用Thread#stop来终止它:
thread.join(3000);
if (thread.isAlive()) {
thread.stop();
}
不推荐使用stop方法,因为它可以使终止线程的活动处于错误状态; ThreadDeath可以在任何地方抛出,因此没有好办法确保停止的线程在退出之前有机会进行清理.但是,由于此类情况,还没有从API中删除stop方法,并且此方法似乎不太可能很快被删除.
这里的弃用并不意味着“这个方法将在以后的版本中删除”作为“危险,除非你知道你在做什么,否则不要使用它”.