2016-02-03 35 views
3

我有一个方法在执行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()之后杀死此线程?

+1

http://stackoverflow.com/questions/6210045/bullet-proof-groovy-script-embedding –

回答

0

如果脚本是不可信的,你不能依赖它来表现良好,那么你不能使用中断,这需要被取消线程的合作(通过明确检查标志Thread.currentThread().isInterrupted或通过输入一个呼叫进入睡眠,等待或加入(即使此时代码可以毫无帮助地压制InterruptedException))。

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

thread.join(3000); 
if (thread.isAlive()) { 
    thread.stop(); 
} 

stop方法已经过时,因为它可以在一个糟糕的状态,离开终止线程的活动; ThreadDeath可以在任何地方抛出,所以没有好方法确保停止的线程在退出前有机会清理。但是,由于类似的情况,停止方法还没有从API中删除,而且这种方法似乎不太可能在短时间内被移除。

此处的弃用并不意味着“这种方法将在更高版本中被删除”,因为“危险,除非您知道自己在做什么,否则不要使用此方法”。

0

只是检查,如果线程处于活动状态:

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

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

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

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

我建议你尝试修改script.run(),这样它最终将结束,并曾达到无无尽的线程工作