【发布时间】:2018-06-28 06:28:13
【问题描述】:
为了避免将自定义ThreadFactory 传递给ThreadPoolExecutor 以直接使用Executors.newCachedThreadPool();。
我创建了一个线程mainDaemonThread,使用Executors.newCachedThreadPool();,提交任务并在mainDaemonThread 启动之前,我将它设置为daemon,据我所知,一旦父 thread 是一个守护进程,那么它创建的所有线程默认都是daemon。
当在某个线程中运行的代码创建新的 Thread 对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时,它才是守护线程。
那么为什么Executors.newCachedThreadPool(); 不遵守规则呢?一些与此相关的设计偏好?
import static java.lang.System.out;
public static void main(String... args) throws InterruptedException {
Thread mainDaemonThread = new Thread(() -> {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(() -> {
try {
out.println(Thread.currentThread().isDaemon());
Thread.sleep(1000);
out.println(Thread.currentThread().isDaemon());
} catch(InterruptedException ignored) {
ignored.printStackTrace();
}
});
});
mainDaemonThread.setDaemon(true);
mainDaemonThread.start();
mainDaemonThread.join();
out.println(Thread.currentThread().isDaemon());
}
演示的输出:
false
false
false
任何帮助将不胜感激,谢谢~
【问题讨论】:
-
如果您从守护线程执行新线程,则该规则适用。如果自定义线程工厂介于两者之间,它可能有自己的语义。这就是 API 允许您通过自己的线程工厂来覆盖所有这些规则的原因。
标签: java java-8 daemon executorservice