多线程异常处理免费资源



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

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();
        }
    }
}

shutdownNow如果 MyTask 忽略任何中断,则表现与shutdown相同。在这种情况下,是的,shutdownNow是多余的。

另一方面,如果中断会影响 a MyTask,则shutdownNow对于停止工作线程是必要的。

它仅在:

时是多余的
  • 所有运行任务都不可中断。
  • 并且在阻塞队列中没有缓存的任务。

呼叫shutdown将使执行者不接受新任务,但是在阻止队列中缓存的任务仍将执行。

致电shutdownNow Will

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

最新更新