Executors.newCachedThreadPool()
использует Executors.defaultThreadFactory()
для своего ThreadFactory
. defaultThreadFactory
javadocs говорят, что «каждый новый поток создается как поток без демона» (выделено мной). Итак, потоки, созданные для newCachedThreadPool
, не являются демонами. Это означает, что они будут препятствовать естественному выходу JVM («естественно», я имею в виду, что вы все равно можете вызвать System.exit(1)
или убить программу, чтобы заставить JVM остановиться).
Причина приложения совсем не заканчивается то, что каждый поток, созданный в newCachedThreadPool
, истекает и закрывается после некоторого времени бездействия. Когда последний из них закрывается, если ваше приложение не имеет ничейных ничейных левых, оно прекратится.
Вы можете (и должны) закрыть ExecutorService
вниз вручную с помощью shutdown
или shutdownNow
.
См. также JavaDoc для Thread , в котором говорится о демонах.