守护线程是程序运行时,后台提供的一种通用服务的线程。
Java线程分为两种:用户线程(非守护线程)、守护线程
用户线程和守护线程本质上没什么区别,唯一的区别在于JVM的退出,如果用户线程全部退出运行。不管是否存在守护线程,JVM都会退出,因为即使存在守护线程,他也没有可守护的用户线程了。垃圾回收线程是典型的守护线程,当JVM开始运行的时候,垃圾回收线程就一直在后台默默守护,对JVM执行过程中产生的垃圾进行回收,当没有任何运行的用户线程时,垃圾回收线程也没有可回收的垃圾了,这时JVM也退出了。
代码测试示例:
package cn.com.demo;
/**
* @Author: Peacock__
* @Date: 2019/4/22 10:44
*/
public class DemoThread extends Thread {
@Override
public void run() {
try {
System.out.println("Thread开始执行");
Thread.sleep(10_000);
System.out.println("Thread执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
情景一:不设置t为守护线程,默认非守护线程
public static void main(String[] args) {
DemoThread t = new DemoThread();
//开启t线程
t.start();
//输出main线程的名字
System.out.println(Thread.currentThread().getName());
}
情景二:设置t为守护线程
public static void main(String[] args) {
DemoThread t = new DemoThread();
//设置t为守护线程
t.setDaemon(true);
//开启t线程
t.start();
//输出main线程的名字
System.out.println(Thread.currentThread().getName());
}
知识点:
1.通过线程.setDaemon(true);设置线程为守护线程。
2.Daemon线程里创建的线程也是Daemon线程。用户线程同样。
3.守护线程与系统“同生共死”
4.程序中全部用户线程执行完毕后JVM直接退出,无需关注是否还存在守护线程。
5.守护线程优先级低