简单理解:当一个进程中只剩下守护线程时(即没有其他的非守护线程了),则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就会结束掉了,也就是进程就结束了,那守护线程肯定跟着结束了。这就是我理解的守护线程,不知道是不是这样理解的,希望大神指点!