In my webapp, I created a service that is using an ExecutorService
with fixed size ThreadPool. I reuse the same ExecutorService
during the whole application lifetime.
private static ExecutorService pool = Executors.newFixedThreadPool(8);
All is running in Tomcat which gives me the following error while shuting down:
appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak.
I do realize I need to shutdown the ExecutorService before shuting tomcat down. Soms SO thread already speak about this but I could not find a clean way to handle this.
Should I use a ShutdownHook
as suggested @Tim-bender in Graceful shutdown of threads and executor ? Or should I use a CachedThreadPool instead?
Shutdown hook is not a good approach in Tomcat because:
it will close the pool too late (on shutdown), Tomcat will already warn you about not closed resources
you actually want to shutdown that pool when application is undeployed so that redeployment works (otherwise each application will create new pool and they will all be closed only on complete shutdown)
shutting down the thread pool might take some time (see below), shutdown hook should be as fast as possible
Much better place is ServletContextListener.contextDestroyed()
. Remember you have to both shutdownNow()
the pool (to cancel running and reject new tasks) and awaitTermination()
to wait for already running tasks to finish and all threads to stop.