Java
中有两类线程:User Thread
(用户线程)、Daemon Thread
(守护线程)
-
只要当前
JVM
实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM
一起结束工作 -
Daemon
的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是GC
-
User
和Daemon
两者几乎没有区别,如果User Thread
全部退出运行,只剩下Daemon Thread
,那虚拟机也会退出(没有了被守护者User Thread
,Daemon Thread
无事可做,没有继续存在的必要) -
除虚拟机提供,开发者也可以设置线程为守护线程
Thread daemonTread = new Thread(); // 设定 daemonThread 为 守护线程,default false(非守护线程) daemonThread.setDaemon(true); // 验证当前线程是否为守护线程,返回 true 则为守护线程 daemonThread.isDaemon();
thread.setDaemonThread(true)
必须在start()
之前设置- 在
Daemon
线程中产生的线程也是Daemon
的 - 不要认为所有的应用都可以分配给
Daemon
来进行服务比如读写操作或计算逻辑
-
JRE
判断程序是否执行结束的标准是所有的前台执行线程执行完毕,而不管后台线程(守护线程)的状态
补充说明:
- 守护线程也称服务线程,没有用户线程执行时,守护线程自动停止
- 优先级较低,用于为系统中的其他对象和线程提供服务
- 通过
setDaemon
将用户线程设置为守护线程 - 垃圾回收线程就是一个经典的守护线程
JVM
中不存在用户线程时,垃圾回收线程也会自动停止- 守护线程依赖于终端,依赖于系统。
Java
中当JVM
中的所有线程都是守护线程时,JVM
就可以退出了