我需要設置一段代碼的超時時間,它將調用jar文件中的方法。 我使用下面的代碼如何檢測未知的線程池並將其關閉?
final Runnable stuffToDo = new Runnable() {
@Override
public void run() {
/* Do stuff here. */
jarclass.run();
}
};
final ExecutorService executor = Executors.newFixedThreadPool(1);
final Future future = executor.submit(stuffToDo);
//executor.shutdown(); // This does not cancel the already-scheduled task.
try {
future.get(1, TimeUnit.SECONDS);
}
catch (InterruptedException ie) {
/* Handle the interruption. Or ignore it. */
}
catch (ExecutionException ee) {
/* Handle the error. Or ignore it. */
}
catch (TimeoutException te) {
/* Handle the timeout. Or ignore it. */
}
if (!executor.isTerminated()){
executor.shutdownNow();
}
然而jarclass.run()莫名其妙地開始其繼續運行另一個線程,並顯示所有帶游泳池-2線程1的打印輸出。
如何完全關閉jarclass.run()?
更新: 我將新線程()更改爲新的Runnable。它仍然不起作用。 我很困惑的是我不知道jarclass在哪裏啓動另一個線程並且無法處理它。當代碼進入executor.shutdownNow()時,它會跳出並運行以下代碼。但jarclass.run()仍在運行。 我不擅長英語。希望我明確這一點。
更新:
問題這段代碼解決:
Future<String> future = new FutureTask<String>(new Callable<String>() {
public String call() throws Exception {
jarclass.run();
return null;
}
});
try {
future.get(1, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
不知道爲什麼以前的代碼失敗......如果有誰知道,我們仍然可以商量。
非常感謝您的回覆。真的很感激它。
您可能要直接使用一個線程,並調用其*中斷*方法。但我不確定這是否會奏效。 – GhostCat
['shutdown'](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#shutdown--)只會阻止添加新任務,但允許已經運行的任務完成:「啓動一個有序關閉,其中執行先前提交的任務,但不會接受任何新任務。」您可以嘗試調用['cancel'](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#cancel-boolean-)(中斷)未來在TimeoutException。 – Fildor
順便說一句:你不需要做stuffToDo一個'新的線程','新的Runnable'會做。這看起來很奇怪,因爲它是一個接口,但實際上你正在創建一個實現接口的匿名類。 – Fildor