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

我有一个方法在执行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方法,并且此方法似乎不太可能很快被删除.

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

点赞