Java是一门多线程的语言,其中Java的线程中有守护线程的概念,其中最为常见的守护线程就是GC线程
。
什么是守护线程
守护线程其实也是一个线程,不过它和普通的用户线程的区别在于,如果JVM中只存在守护线程正在运行,那么JVM不会等待守护线程运行完毕,直接会结束程序的运行。
守护线程和用户线程的区别
守护线程 |
用户线程 |
JVM不会等待守护线程执行完毕 |
JVM会等待用户线程执行完毕 |
在守护线程里面创建的线程也是一个守护线程 |
在用户线程里面创建的线程是一个用户线程 |
守护线程依赖于用户线程的存在,如果用户线程全部退出,那么守护线程也会退出 |
用户线程不依赖于其他用户线程,用户线程的退出不会影响其他用户线程执行,同样其他用户线程退出也不会影响用户线程执行 |
创建守护线程
在Java中创建的线程默认都是用户线程,如果需要把一个线程设置为守护线程,那么需要调用该线程的public final void setDaemon(boolean on)
方法,参数传入true
则为守护线程,默认为false
,为用户线程。
1 2 3
| Thread thread = new Thread(()->System.out.println(Thread.currentThread().getName()+"线程")); thread.setDaemon(true); thread.start();
|
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public class DaemonThreadTest { public static void main(String[] args) { new Thread(()->{ try { System.out.println("用户线程正在运行……"); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); Thread daemonThread = new Thread(()->{ new Thread(()-> { try { while(true) { System.out.println("守护线程创建的线程同样也是一个守护线程……"); Thread.sleep(1000); } } catch (InterruptedException e) { e.printStackTrace(); } }).start(); try { while(true) { System.out.println("守护线程正在守护……"); Thread.sleep(1000); } } catch (InterruptedException e) { e.printStackTrace(); } }); daemonThread.setDaemon(true); daemonThread.start(); } }
|
代码执行结果为:
1 2 3 4 5 6 7 8 9 10 11
| 用户线程正在运行…… 守护线程正在守护…… 守护线程创建的线程同样也是一个守护线程…… 守护线程创建的线程同样也是一个守护线程…… 守护线程正在守护…… 守护线程创建的线程同样也是一个守护线程…… 守护线程正在守护…… 守护线程创建的线程同样也是一个守护线程…… 守护线程正在守护…… 守护线程创建的线程同样也是一个守护线程…… 守护线程正在守护……
|