• 概念介绍

Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程。当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因为没有如果没有了被守护这,也就没有继续运行程序的必要了。如果有非守护线程仍然存活,VM就不会退出。

守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。用户可以用Thread的setDaemon(true)方法设置当前线程为守护线程。

虽然守护线程可能非常有用,但必须小心确保其他所有非守护线程消亡时,不会由于它的终止而产生任何危害。因为你不可能知道在所有的用户线程退出运行前,守护线程是否已经完成了预期的服务任务。一旦所有的用户线程退出了,虚拟机也就退出运行了。 因此,不要在守护线程中执行业务逻辑操作(比如对数据的读写等)。、

另外有几点需要注意:

1、setDaemon(true)必须在调用线程的start()方法之前设置,否则会抛出IllegalThreadStateException异常。

2、在守护线程中产生的新线程也是守护线程。 
3、 不要认为所有的应用都可以分配给守护线程来进行服务,比如读写操作或者计算逻辑。

  • 代码验证
public static void main(String[] args) {
        Thread thread = new Thread(()->{
            //模拟耗时时间
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.print(Thread.currentThread().getId()+",状态:"+ Thread.currentThread().isAlive());

        },"T2");
        thread.setDaemon(true);
        thread.start();
    }

执行结果

java 协程 守护线程 线程 java守护线程作用_守护线程

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        Thread thread = new Thread(()->{
            System.out.print(Thread.currentThread().getId()+",状态:"+ Thread.currentThread().isAlive());
        },"T1");
        thread.setDaemon(true);
        thread.start();

执行结果

java 协程 守护线程 线程 java守护线程作用_守护线程_02

  • 说明

很多人被网上的答案左右了,其实守护线程在主程序的执行与否取决于守护线程的执行时间,主线程结束守护线程不一定执行