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

标签 java multithreading groovy 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();
}

此代码适用于没有无限循环的脚本。但是,如果存在无限循环,则响应“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/

相关文章:

java - SSLSocketFactory编译错误

java - ThreadPoolExecutor 拒绝错误

JavaFX 简单更新标签(线程)

Groovy 运算符重载增量/减量错误

Java 比较值时没有这样的元素异常?

java - 如何将 Int 转换为无符号字节并返回

java - 非法线程状态异常 : Thread already started on a new Thread

xml - 我可以在不转义属性值的情况下创建 Groovy 节点吗?

java - Groovy Map<String,List<Map<String,String>>> 数据操作

java - Recycleview删除数据-显示数据问题