简单理解:当一个进程中只剩下守护线程时(即没有其他的非守护线程了),则JVM就会结束,也就是说守护线程也会跟着结束了,即使守护线程中的代码还没执行完,示例代码如下:
fun main() {
val daemonThread = thread(isDaemon = true) {
(1..5).forEach {
println("daemonThread:$it")
Thread.sleep(6000)
}
}
val userThread = thread {
(1..5).forEach {
println("userThread:$it")
Thread.sleep(3000)
}
}
Runtime.getRuntime().addShutdownHook(thread(false) {
println("JVM exit!")
})
}
执行结果如下:
daemonThread:1
userThread:1
userThread:2
daemonThread:2
userThread:3
userThread:4
daemonThread:3
userThread:5
JVM exit!
代码中,我们开了一个守护线程,一个用户线程,当然还有一个main线程,main线程瞬间就执行结束了,剩下两个子线程,用户线程呢每3秒打印一条信息,而守护线程呢每6秒打印一条,所以我们看一看到,守护线程打印一条消息后,用户线程就会打印两条,当用户线程执行完5次打印后,用户线程就结束了,但是守护线程的5次循环还没结束呢,但是没办法,谁让他是守护线程啊,现在只剩下守护线程了,所以JVM就会结束掉了,也就是进程就结束了,那守护线程肯定跟着结束了。这就是我理解的守护线程,不知道是不是这样理解的,希望大神指点!