2011-08-29 63 views
1

我正在嘗試在java中運行一些javascripts。我不確定腳本是否正確,我想在一段時間後終止該調用。這是我如何運行腳本。如何殺死java Invocable

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()取消,所以任何不能響應中斷的任務都不會終止。

在此先感謝

+0

有沒有保證的方式來停止線程。 Java線程必須自行停止以保證程序的安全。 –

回答

2

您可以測試如何ScriptEvaluator()響應Thread.interrupt()。如果寫得很好,那麼executor.shutdownNow()將起作用。如果不是,那麼就沒有完美的解決方案。

但是,假設您的JavaScript不會與您的主代碼進行交互,那麼您可以使用Thread.stop()。如果您決定這樣做,那麼一定要確定您瞭解why not to use Thread.stop()

0

Executor.shutdownNow()並不總是正常工作,也許你需要Thread.stop()作爲硬核解決方案。