I'm trying to handle all exceptions generated in a multithreaded problem so as to eliminate memory leaks, interrupted or execution exceptions (I do not want to propagate them) and similar. In the event that I interrupt a thread (Thread.currentThread().interrupt()
), is shutdownNow()
redundant in the finally
below?
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
will behave the same way as shutdown
if a MyTask
ignore any interruptions. In this case, yes, shutdownNow
is redundant.
On the other hand, if the interruption can affect a MyTask
, then shutdownNow
is necessary for stopping working threads.
It is redundant only when:
Call shutdown
will make the executor not accept new tasks, but the tasks cached in the blocking queue will still be executed.
Call shutdownNow
will
interrupt
all tasks that are runningIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With