知识卡片
Daemon不担保收尾
内容
守护线程只适合后台辅助工作,不能承担必须完成的业务收尾。JVM 与用户线程是主动关系:用户线程全部终止 JVM 才终止;与守护线程是被动关系,用户线程结束后 JVM 会强行终止所有守护线程,不等它们跑完。文件落盘、释放数据库连接这类动作放在守护线程里可能被强行中断、导致资源不可逆损坏,应交给用户线程或关闭钩子。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第1章《多线程原理与实战》1.5.6节《线程的daemon操作》(源文件:_epub-src/OEBPS/Text/chapter29.xhtml)
- 结论依据:原文的演示案例显示,JVM 退出时守护线程 daemonThread 仍在死循环中执行,但“JVM不管这些,强行终止了所有守护线程的执行”,并进一步提醒“守护线程存在被JVM强行终止的风险,所以在守护线程中尽量不去访问系统资源……可能会引发系统资源操作不负责任的中断”,因此推出守护线程不能承担必须完成的收尾工作。
- 原始内容:在JVM退出时,守护线程daemonThread还远远没有结束,还在死循环的执行中。但是JVM不管这些,强行终止了所有守护线程的执行……守护线程存在被JVM强行终止的风险,所以在守护线程中尽量不去访问系统资源,如文件句柄、数据库连接等。守护线程被强行终止时,可能会引发系统资源操作不负责任的中断,从而导致资源不可逆的损坏。