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

时间:2016-02-03 19:49:04

标签: 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();
}

此代码适用于没有无限循环的脚本。但是,如果存在无限循环,则响应"它运行!"被传递给客户端,但线程仍然存在。如何在join()之后杀死此帖子?

3 个答案:

答案 0 :(得分:1)

如果脚本不受信任并且您不能依赖它来表现良好,那么您就不能使用中断,这需要取消线程的合作(通过{{1}显式检查标志或者通过输入一个睡眠,等待或加入的调用(即使这样,代码也可能以无用的方式压制InterruptedException))。

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

Thread.currentThread().isInterrupted

不推荐使用stop方法,因为它可以使终止线程的活动处于错误状态; ThreadDeath可以在任何地方抛出,因此没有好办法确保停止的线程在退出之前有机会进行清理。但是,由于此类情况,还没有从API中删除stop方法,并且此方法似乎不太可能很快被删除。

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

答案 1 :(得分:0)

检查线程是否存活:

Thread thread = new Thread()
    thread.join(3000)

    if (thread.isAlive()) {
        thread.interrupt()
        // TODO
    } else {
        // TODO
    }

答案 2 :(得分:0)

不幸的是,除非您的脚本中有阻塞操作,否则interrupt()方法不会对您有所帮助。 interrupt()方法仅在阻塞时才中断线程。

您无法像这样终止正在运行的线程。 您可以使用thread.isAlive()方法检查线程是否仍然有效,但您无法阻止它。

我建议你尝试修改你的script.run(),以便它最终结束,并且永远不会有无尽的线程工作