守护线程
定义
在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。 所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护线程,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
示例
使用匿名线程的方式创建一个线程,这个线程持续睡眠1ms,主线程睡眠1000ms输出,主线程main结束
public class TestDemo1 {
public static void main(String[] args){
Thread thread = new Thread(() -> {
while (true){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.setDaemon(true);
thread.start();
try {
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("main结束");
}
}
特点
a.线程属性isDaemon的状态为true的。
b.当jvm应用中没有运行的用户线程时,守护线程会结束运行。
c.将线程变为守护线程,通过设置线程的方法 setDaemon(true)即可,但该方法必须在start()方法之前执行才可以,启动后的线程,不能中途改变线程类型
d.如果使用线程池框架ExecuteService,则守护线程会被改变成用户线程,线程的优先级也会被设置成普通线程的优先级。ExecuteService主要是用来管理线程的,不能创建线程。
e.守护线程具有传递性,当线程设置成守护线程了,那么它的子线程也是守护线程。
f.可以自动结束生命周期
使用
将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。
- 注意:setDaemon方法只能线程启动之前使用,如果对于一个线程已经死亡或者未启动,那么设置setDaemon会抛出IllegalThreadStateException
JVM什么情况下退出?
- The java virtual machine exits when the only thread running are all dameon thread.
- 如果JVM没有一个守护线程,JVM进程不会退出
- eg. 如果垃圾回收线程是一个非守护线程,那么某一程序完成工作运行结束,JVM无法退出,垃圾回收线程依旧工作