守护线程是低优先级的线程,它的作用仅仅是为用户线程(非守护线程)提供服务。正是由于守护线程是为用户线程提供服务的,仅仅在用户线程处于运行状态时才需要守护线程。另外,一旦所有的用户线程都运行完毕,那么守护线程是无法阻止JVM退出的。即当程序只剩下守护线程的时候程序就会退出。
守护线程的作用类似在后台静默执行 ,最典型的就是JVM的垃圾回收机制, 这个就是一个守护线程。
用户线程是高优先级的线程。JVM虚拟机在结束一个用户线程之前,会先等待该用户线程完成它的任务。
注意:main函数是个比较特殊的用户线程。不是守护线程。
可以直接看到,在非守护线程结束后, 程序直接退出了,而没有考虑守护进程。
package com.Kuang; /** * @author cyt * @create 2020-03-07 14:49 */ public class damon { public static void main(String[] args) { You you = new You(); God god = new God(); Thread y = new Thread(you); Thread g = new Thread(god); // 必须在开启线程之前设置 g.setDaemon(true); // 设置为守护进程,虚拟不会考虑守护进程是否开启 // 用户进程一旦结束,虚拟机也会直接结束,而不考虑守护进程。 y.start(); g.start(); } } class You implements Runnable { @Override public void run() { for (int i = 0; i < 365; i++) { System.out.println("我在活着"); } System.out.println("我死了"); } } class God implements Runnable { @Override public void run() { while (true) { System.out.println("上帝守护你"); } } } 我在活着 我在活着 我在活着 我在活着 我在活着 我在活着 我在活着 我在活着 我在活着 我在活着 我死了 上帝守护你 上帝守护你 上帝守护你 上帝守护你 上帝守护你 Process finished with exit code 0