【发布时间】:2014-01-08 15:01:06
【问题描述】:
我想启动一个线程,如果它没有在 5 秒内完成就取消它:
private final class HelloWorker implements Callable<String> {
public String call() throws Exception {
while(true) {
if (Thread.isInterrupted()) {
return null;
}
}
return performExpensiveComputation();
}
private String performExpensiveComputation() {
// some blocking expensive computation that may or may not take a very long time
}
}
private ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
Future<String> future = executorService.submit(new HelloWorker());
try {
String s = future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException e) {
future.cancel(true);
System.out.println("cancelled: " + future.isCancelled() + "done: " + future.isDone());
executorService.shutdown();
try {
System.out.println("try to terminate: " + executorService.awaitTermination(60, TimeUnit.SECONDS));
} catch (Exception ex) {
// ignore
}
}
但是,awaitTermination 似乎返回 false。有没有办法让我检查为什么 ExecutorService 不会终止?我可以弄清楚哪些线程仍在运行吗?
【问题讨论】:
-
future.cancel(true)实际上会中断线程。但这只会打开thread.isInterrupted()标志。您需要对其进行测试或注意您的InterruptedExceptions。 -
有什么方法可以调用 thread.stop()?
-
thread.stop()已弃用。请参阅@Marko 的回答。 -
@Popcorn 你不需要调用 Thread.stop() 你需要在 performExpensiveComputation() 中检查 Thread.interrupted() (或者 isInterrupted() 见我的长答案)
标签: java multithreading threadpool executorservice futuretask