守护线程就是将一个线程作为「后台线程」或者「内部线程」,类似于管理内存垃圾回收的线程一样。
所以,只要主线程结束了,JVM 就会结束。
有一种线程的目的就是无线循环,比如定时器触发任务的线程:

  1. class TimerThread extends Thread {
  2. @Override
  3. public void run() {
  4. while (true) {
  5. System.out.println(LocalTime.now());
  6. try {
  7. Thread.sleep(1000);
  8. } catch (InterruptedException e) {
  9. break;
  10. }
  11. }
  12. }
  13. }

可以将这样的线程指定为守护线程,但其他线程结束后,就会结束 JVM。
使用守护线程的方法很简单,在调用 start() 方法前,调用 setDaemon(true) 把该线程标记为守护线程即可:

  1. Thread t = new TimerThread();
  2. t.setDaemon(true);
  3. t.start();

在守护线程中,编写代码要注意:守护线程不能持有任何需要关闭的资源,例如打开文件等,因为虚拟机退出时,守护线程没有任何机会来关闭文件,这会导致数据丢失。

小结

守护线程是为其他线程服务的线程;
所有非守护线程都执行完毕后,虚拟机退出;
守护线程不能持有需要关闭的资源(如打开文件等)。