多线程异常处理释放资源
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
所有 运行 的任务
- 取消队列中的所有任务
我正在尝试处理多线程问题中生成的所有异常,以消除内存泄漏、中断或执行异常(我不想传播它们)等类似情况。如果我中断了一个线程 (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
所有 运行 的任务
- 取消队列中的所有任务