如何杀死java Invocable

时间:2011-08-29 14:04:50

标签: java multithreading

我正在尝试在java中运行一些javascripts。我不确定脚本是否正确,我想在一段时间后终止调用。这就是我运行脚本的方式。

returnMethod = invocableEngine.invokeFunction("main", input);

我的想法是运行像deamon线程,它以超时启动第二个线程。第二个线程 - ScriptEvaluator运行上面描述的可调用函数。 ScriptEvaluator实现了Runnable。

ScriptEvaluator se = new ScriptEvaluator(r);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.invokeAll(Arrays.asList(Executors.callable(se)), timeout, TimeUnit.MILLISECONDS);
executor.shutdownNow();

嗯它不起作用。超时后,线程仍然运行。

另一个要求是只有一个 SkriptEvaluator线程正在运行。

编辑:我在shutdownNow()中找到了一些非常有趣的东西。当它不能保证停止线程时,有保证的方法吗?

  

除了尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。

提前致谢

2 个答案:

答案 0 :(得分:2)

您可以测试ScriptEvaluator()Thread.interrupt()的响应方式。如果写得好,那么executor.shutdownNow()就可以了。如果不是,那就没有完美的解决方案。

但是,假设您的javascript没有与主代码交互那么多,您可以使用Thread.stop()。如果您决定这样做,请确保您一般了解why not to use Thread.stop()

答案 1 :(得分:0)

Executor.shutdownNow()并不总是正常运行,也许您需要Thread.stop()作为核心解决方案。