我需要设置一段代码的超时时间,它将调用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