我试图处理多线程问题中生成的所有异常,以消除内存泄漏,中断或执行异常(我不想传播它们)等。如果我中断了一个帖子(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();
}
}
}
多余的?
@Nullable
private Runnable nulltest(@Nullable String myNullableString) {
if(myNullableString == null) {
return null;
}
return new Runnable() {
@Override
public void run() {
System.out.println("This string is not null: " + myNullableString);
}
};
}
答案 0 :(得分:1)
shutdownNow
忽略任何中断,则 shutdown
的行为与MyTask
相同。在这种情况下,是的,shutdownNow
是多余的。
另一方面,如果中断可能会影响 MyTask
,则需要shutdownNow
来停止工作线程。
答案 1 :(得分:1)
仅在以下情况下才是多余的:
调用shutdown
将使执行程序不接受新任务,但仍将执行阻塞队列中缓存的任务。
致电shutdownNow
将
interrupt
正在运行的所有任务