一 概述
有时候,我们需要创建一个线程执行一些辅助工作,但又不希望这个线程阻碍JVM的关闭。此时我们就需要使用守护线程(Daemon Thread)。
二 普通线程&守护线程
线程分为两种:普通线程和守护线程。在JVM启动时创建的所有线程中,除了主线程以外,其他的线程都是守护线程(例如垃圾回收器(即GC线程)以及其他执行辅助工作的线程)。当创建一个新线程时,新线程将继承创建它的线程的守护状态,因此在默认情况下,主线程创建的所有线程都是普通线程。
普通线程与守护线程之间的差异仅在于当线程退出时发生的操作。当一个线程退出时,JVM会检查其他正在运行的线程,如果这些线程都是守护线程,那么JVM会正常退出操作。当JVM停止时,所有仍然存在的守护线程都将被抛弃——既不会执行finally代码块,也不会执行回卷栈,而JVM只是直接退出。
我们应尽可能减少使用守护线程——很少有操作能够在不进行清理的情况下被安全地抛弃。特别的是,如果在守护线程中执行可能包含I/O操作的任务,那么将是一种危险的行为。守护线程最好用于执行"内部"任务,例如周期性地从内存的缓存中移除逾期的数据。
此外,守护线程通常不能用来替代应用程序管理程序中各个服务的声明周期。