如何阻止线程继续执行无限循环

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()

Nat*_*hes 3

如果脚本不受信任并且您不能依赖它表现良好,那么您就不能使用中断,这需要被取消的线程的配合(通过显式检查标志或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 中删除,并且该方法似乎不太可能很快被删除。

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