我正在尝试处理多线程问题中生成的所有异常,以消除内存泄漏,中断或执行异常(我不想传播它们(并且相似。如果我中断线程(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
所有正在运行的任务 - 取消队列中的所有任务