尽管有活动任务,ExecutorService.awaitTermination仍会进入超时状态

时间:2017-09-28 07:54:22

标签: java multithreading

我有以下实现:

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(),不应该启动队列中的新任务,我想知道为什么我仍然会得到超时。

有什么想法吗?

0 个答案:

没有答案