Полагаю, это не совсем правильный ответ, почему:
Документ, на который вы ссылаетесь, предназначен для класса Thread
и документирует поведение "ручного" создания нового Thread
. Это просто не относится к задачам, которые вы отправляете на ExecutorService
(хотя я понимаю, почему вы этого ожидаете).
Если вы посмотрите на источник, исполнитель newCachedThreadPool
использует (внутренний) DefaultThreadFactory
, который явно создает не-демон Thread
:
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false); // ta-da
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
Если вы хотите, чтобы исполнитель создал поток демона, вы можете использовать метод Executors#newCachedThreadPool(ThreadFactory)
с фабрикой, которая создает демон Thread
s. Поскольку ThreadFactory
является функциональным интерфейсом, это так же просто, как
Executors#newCachedThreadPool(Thread::new);