java垃圾回收机制回收的是守护进程

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)