我有以下实现:
final ExecutorService service = Executors.newFixedThreadPool(4);
final List<Callable> taskList = new LinkedList<>();
for (Path path : paths) {
final SomeCallable task = new SomeCallable(path);
taskList.add(task);
service.submit(task);
}
synchronized (this) {
try {
this.wait();
shutdown(service);
} catch (InterruptedException e) {
shutdown(service);
}
}
以下shutdown(service)
方法:
protected void shutdown(final ExecutorService service) {
List<Runnable> abortedCallables = service.shutdownNow();
try {
if (!service.awaitTermination(2, TimeUnit.MINUTES)) {
System.out.println("timeout");
}
}
catch (InterruptedException e) {
// (Re-)cancel all Callables if current thread has been interrupted
service.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
我的问题如下:paths
是很多Path
个实例的列表。所有这些路径都将在SomeCallable
实例中进行一些处理。通常,this
线程会等待,直到在SomeCallable
内成功处理所有路径。处理完所有路径后,将调用shutdown(service)
。
但是,this
线程可能会被中断并且必须立即关闭。因此,我在shutdown(service)
- 块内调用catch
。有效的是,当前正在运行的SomeCallable
- 实例将完成,并且ExecutorService的线程池中的任何任务都不会被启动。尽管如此,awaitTermination
总是会遇到2分钟超时。这是为什么?
我假设awaitTermination
等待当前活动的正在运行的任务终止(因此,等待最多4个任务 - >线程池大小)。两分钟 - 在我的情况下 - 足以让4个任务完成。通过调用shutdownNow()
,不应该启动队列中的新任务,我想知道为什么我仍然会得到超时。
有什么想法吗?