守护线程就是将一个线程作为「后台线程」或者「内部线程」,类似于管理内存垃圾回收的线程一样。
所以,只要主线程结束了,JVM 就会结束。
有一种线程的目的就是无线循环,比如定时器触发任务的线程:
class TimerThread extends Thread {
@Override
public void run() {
while (true) {
System.out.println(LocalTime.now());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}
}
}
}
可以将这样的线程指定为守护线程,但其他线程结束后,就会结束 JVM。
使用守护线程的方法很简单,在调用 start()
方法前,调用 setDaemon(true)
把该线程标记为守护线程即可:
Thread t = new TimerThread();
t.setDaemon(true);
t.start();
在守护线程中,编写代码要注意:守护线程不能持有任何需要关闭的资源,例如打开文件等,因为虚拟机退出时,守护线程没有任何机会来关闭文件,这会导致数据丢失。
小结
守护线程是为其他线程服务的线程;
所有非守护线程都执行完毕后,虚拟机退出;
守护线程不能持有需要关闭的资源(如打开文件等)。