每一秒钟的时间都值得铭记

0%

守护线程和用户线程

Java是一门多线程的语言,其中Java的线程中有守护线程的概念,其中最为常见的守护线程就是GC线程

什么是守护线程

守护线程其实也是一个线程,不过它和普通的用户线程的区别在于,如果JVM中只存在守护线程正在运行,那么JVM不会等待守护线程运行完毕,直接会结束程序的运行。

守护线程和用户线程的区别

守护线程 用户线程
JVM不会等待守护线程执行完毕 JVM会等待用户线程执行完毕
在守护线程里面创建的线程也是一个守护线程 在用户线程里面创建的线程是一个用户线程
守护线程依赖于用户线程的存在,如果用户线程全部退出,那么守护线程也会退出 用户线程不依赖于其他用户线程,用户线程的退出不会影响其他用户线程执行,同样其他用户线程退出也不会影响用户线程执行

创建守护线程

在Java中创建的线程默认都是用户线程,如果需要把一个线程设置为守护线程,那么需要调用该线程的public final void setDaemon(boolean on)方法,参数传入true则为守护线程,默认为false,为用户线程。

1
2
3
Thread thread = new Thread(()->System.out.println(Thread.currentThread().getName()+"线程"));
thread.setDaemon(true);
thread.start();

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class DaemonThreadTest {	
public static void main(String[] args) {
new Thread(()->{
try {
System.out.println("用户线程正在运行……");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();

Thread daemonThread = new Thread(()->{
new Thread(()-> {
try {
while(true) {
System.out.println("守护线程创建的线程同样也是一个守护线程……");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
try {
while(true) {
System.out.println("守护线程正在守护……");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
daemonThread.setDaemon(true);
daemonThread.start();
}
}

代码执行结果为:

1
2
3
4
5
6
7
8
9
10
11
用户线程正在运行……
守护线程正在守护……
守护线程创建的线程同样也是一个守护线程……
守护线程创建的线程同样也是一个守护线程……
守护线程正在守护……
守护线程创建的线程同样也是一个守护线程……
守护线程正在守护……
守护线程创建的线程同样也是一个守护线程……
守护线程正在守护……
守护线程创建的线程同样也是一个守护线程……
守护线程正在守护……
坚持原创技术分享,您的支持将鼓励我继续创作!
-------------这是我的底线^_^-------------