用户线程和守护线程


用户线程和守护线程

用户线程(User Thread)

一般情况下不做特别说明配置,默认都是用户线程,是系统的工作线程,它会完成这个程序需要完成的业务员操作

isDaemon测试此线程是否为守护线程

通过Thread.setDaemon(false)设置为用户线程

public class DaemonDemo {
    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"\t 开始运行,"
                    +(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
            while (true){

            }

        },"t1");
        t1.start();

        System.out.println(Thread.currentThread().getName()+"\t 开始运行,"
                +(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
    }
}

image-20220807160012294

守护线程(Daemon Thread)

是一种特殊的线程为其它线程服务的,在后台默默地完成一些系统性的服务,比如垃圾回收线程就是最典型的例子。

守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以假如当系统只剩下守护线程的时候,java虚拟机会自动退出。

通过Thread.setDaemon(true)设置为守护线程

import java.util.concurrent.TimeUnit;

public class DaemonDemo {
    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"\t 开始运行,"
                    +(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
            while (true){

            }

        },"t1");
        t1.setDaemon(true);
        t1.start();

        //暂停几秒线程
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"\t 开始运行,"
                +(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
    }
}

image-20220807160129318

我们发现,程序已经推出了,因为t1是守护线程,当main线程(用户线程)结束后,系统只剩下守护线程,就自动退出了。

总结:

  1. 如果用户线程全部结束意味着程序需要完成的业务操作已经结束了,守护线程随着JVM一同结束工作

  2. setDaemon(true)方法必须在start()之前设置,否则报legalThreadStateException异常


Author: qwq小小舒
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source qwq小小舒 !
  TOC