gpt4 book ai didi

java - 如何阻止线程继续执行死循环

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:24 27 4
gpt4 key购买 nike

我有一个方法可以在执行 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();
}

此代码适用于没有无限循环的脚本。但是,如果存在无限循环,则响应“It ran!”已交付给客户端,但线程仍然存在。如何在 join() 之后终止该线程?

最佳答案

如果脚本不受信任并且您不能依赖它表现良好,那么您就不能使用中断,这需要被取消的线程的合作(通过显式检查标志 Thread .currentThread().isInterrupted 或通过输入对 sleep 、等待或加入的调用(即使这样,代码也会以无用的方式压制 InterruptedException))。

您只能通过对其调用 Thread#stop 来终止它:

thread.join(3000);
if (thread.isAlive()) {
thread.stop();
}

停止方法已被弃用,因为它会使已终止的线程的 Activity 处于不良状态; ThreadDeath 可以在任何地方抛出,因此没有好的方法来确保停止的线程在退出之前有机会进行清理。然而,由于这种情况,stop 方法并没有从 API 中移除,而且这个方法似乎不太可能很快被移除。

这里的弃用并不意味着“这个方法将在以后的版本中删除”而是“危险,除非你知道你在做什么,否则不要使用它”。

关于java - 如何阻止线程继续执行死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35186333/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com