守护线程就是将一个线程作为「后台线程」或者「内部线程」,类似于管理内存垃圾回收的线程一样。
所以,只要主线程结束了,JVM 就会结束。
有一种线程的目的就是无线循环,比如定时器触发任务的线程:
class TimerThread extends Thread {@Overridepublic 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();
在守护线程中,编写代码要注意:守护线程不能持有任何需要关闭的资源,例如打开文件等,因为虚拟机退出时,守护线程没有任何机会来关闭文件,这会导致数据丢失。
小结
守护线程是为其他线程服务的线程;
所有非守护线程都执行完毕后,虚拟机退出;
守护线程不能持有需要关闭的资源(如打开文件等)。
