多线程异常处理释放资源

multithread exception handling free resources

我正在尝试处理多线程问题中生成的所有异常,以消除内存泄漏、中断或执行异常(我不想传播它们)等类似情况。如果我中断了一个线程 (Thread.currentThread().interrupt()),下面的 finally 中的 shutdownNow() 是多余的吗?

ThreadPoolExecutor service = new ThreadPoolExecutor(coreSize, maxSize);

// do stuff

try {               
    List<Future<?>> futures = new ArrayList<Future<?>>();

    for (Item item : items) {
        // processing logic
        Runnable myTask = new MyTask();
        futures.add(service.submit(myTask));
    }

    for (Future<?> f : futures) {
        f.get();
    }
} catch (Exception e) {
    // todo
} finally {
    service.shutdown();
    try {
        service.awaitTermination(duration, TimeUnit.SECONDS);
    } catch (Exception e) {
        // todo
        Thread.currentThread().interrupt();
    } finally {
        if (!service.isTerminated()) {
            service.shutdownNow();
        }
    }
}
如果 MyTask 忽略任何中断

shutdownNow 的行为将与 shutdown 相同。在这种情况下,是的,shutdownNow 是多余的。

另一方面,如果中断会影响一个MyTask,那么shutdownNow是停止工作线程所必需的。

仅在以下情况下是多余的:

  • 所有 运行 任务都不可中断。
  • 并且阻塞队列中没有缓存任务。

调用shutdown会让执行器不接受新的任务,但是缓存在阻塞队列中的任务仍然会被执行

调用 shutdownNow

  • interrupt 所有 运行
  • 的任务
  • 取消队列中的所有任务