[Q&A] 怎么设置守护线程?
可以通过调用Thread.setDaemon(true)
将线程设置为Daemon线程。
注意:Daemon属性需要在启动线程之前
设置,不能在启动线程之后设置。
[Q&A] 守护线程finally快的风险?
JVM中没有非Daemon线程时,虚拟机需要退出。此时Java虚拟机中的所有Daemon线程都需要立即终止,因此DaemonRunner立即终止,但是DaemonRunner中的finally块
并没有执行。所以在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或清理资源的逻辑。
-----------------------------------------------------------------------------读书笔记摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明
[Q&A] JVM程序在什么情况下会退出?
※The Java Virtual Machine exits when the only threads running are all daemon threads.
上面这句话来自于JDK的官方文档,当然这句话指的是正常退出
的情况,而不是调用了System.exit()
方法,通过这句话的描述,我们不难发现,在正常情况下,若JVM中没有一个非守护线程,则JVM的进程会退出。
[Q&A] 守护线程的作用
守护线程经常用作与执行一些后台任务
,因此有时它也被称为后台线程,当你希望关闭某些线程的时候,或者退出JVM进程的时候,一些线程能够自动关闭
,此时就可以考虑用守护线程为你完成这样的工作。
-----------------------------------------------------------------------------读书笔记摘自书名:Java高并发编程详解:多线程与架构设计 作者:汪文君
[Q&A] 由守护线程构成的线程池的作用
public static ThreadFactory build(String nameFormat) {
return new ThreadFactoryBuilder().setDaemon(true).setNameFormat(nameFormat).build();
}
Java程序无法终止或者退出一个正在运行中的线程,所以最后剩下的那个线程会由于一直等待无法发生的事件而引发问题。如果将线程标记为守护进程,意味着程序退出时它也会被回收。这二者之间没有性能上的差异。
-----------------------------------------------------------------------------读书笔记摘自书名:《Java8 实战》第11章 CompletableFuture:组合式异步编程