L B*_*ker 5 java groovy multithreading java-threads
我有一个方法可以在执行 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();
}
Run Code Online (Sandbox Code Playgroud)
此代码适用于没有无限循环的脚本。但是,如果存在无限循环,则响应“It ran!” 已交付给客户端,但线程仍处于活动状态。我如何在之后杀死这个线程join()?
如果脚本不受信任并且您不能依赖它表现良好,那么您就不能使用中断,这需要被取消的线程的配合(通过显式检查标志或Thread.currentThread().isInterrupted输入对 sleep 的调用) 、等待或加入(即使如此,代码也可能以无益的方式抑制 InterruptedException))。
您只能通过调用 Thread#stop 来终止它:
thread.join(3000);
if (thread.isAlive()) {
thread.stop();
}
Run Code Online (Sandbox Code Playgroud)
stop 方法已被弃用,因为它会使终止线程的活动处于不良状态;ThreadDeath 可以在任何地方抛出,因此没有好的方法可以确保停止的线程在退出之前有机会进行清理。但是,由于此类情况,stop 方法尚未从 API 中删除,并且该方法似乎不太可能很快被删除。
这里的弃用并不意味着“这个方法将在以后的版本中被删除”,而是意味着“危险,除非你知道自己在做什么,否则不要使用它”。
| 归档时间: |
|
| 查看次数: |
3116 次 |
| 最近记录: |