Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何阻止线程继续执行无限循环_Java_Multithreading_Groovy_Java Threads - Fatal编程技术网

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

Java 如何阻止线程继续执行无限循环,java,multithreading,groovy,java-threads,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() {

我有一个方法可以在执行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 run!”会传递给客户机,但线程仍然处于活动状态。在
join()
之后,如何杀死此线程?

如果脚本不受信任,并且您无法依赖它表现良好,则不能使用中断,这需要取消线程的合作(通过使用
thread.currentThread()显式检查标志).isInterrupted
或通过输入对sleep、wait或join的调用(即使这样,代码也会以一种毫无帮助的方式压制InterruptedException)

您只能通过调用线程#停止它来终止它:

thread.join(3000);
if (thread.isAlive()) {
    thread.stop();
}
stop方法已被弃用,因为它会使终止线程的活动处于错误状态;ThreadDeath可以抛出到任何地方,因此没有好的方法来确保停止的线程在退出之前有机会进行清理。然而,由于这种情况,停止方法还没有从API中删除,而且似乎不太可能很快删除此方法


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

只需检查线程是否处于活动状态:

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

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

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

不能像那样终止正在运行的线程。 您可以使用
thread.isAlive()
方法检查线程是否仍然工作,但无法停止它

我建议您尝试修改
script.run()
,这样它最终会结束,而不会出现无休止的线程工作