Java有两种Thread:“守护线程Daemon”(守护线程)与“用户线程User”(非守护线程)。
非守护线程的转换守护线程使用 setDaemon(true); //设置守护线程
但是Executors创建的线程池都是非守护线程。
所以,一般情况下,我们使用executors创建多线程时,就会使用默认的threadFactory(即调用只有一个参数的工厂方法),而创建出来的线程就是非守护的。而相应的程序就永远不会退出,如采用Executors创建定时调度任务时,这个调试任务永远不会退出。解决的办法就是重写相对应的 threadFactory,如下所示:
new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread s = Executors.defaultThreadFactory().newThread(r);
s.setDaemon(true);
return s;
}
}
同理,对于java web项目中的线程程序,一定要记住将相应的线程标记为守护线程(尽管它默认就是守护的)。而对于使用Executors,一定要记住传递相应的threadFactory实现,以重写相应的newThread方法,将线程标记为守护线程。
本文介绍了Java中守护线程的概念及如何将非守护线程转换为守护线程的方法。特别针对使用Executors创建线程池时,如何通过自定义ThreadFactory来确保线程被标记为守护线程,从而避免程序因等待非守护线程结束而无法正常退出的问题。
1360

被折叠的 条评论
为什么被折叠?



