用户线程:平常创建的线程如果不做设置,默认都是用户线程,用来完成一些业务。
守护线程:守护线程需要在线程创建后做设置,设置为守护线程后那么该线程会随着用户线程的退出而退出;
举个例子,刘备、关羽、张飞三人桃园三结义,立下同年同月同日死的誓约,假如刘备就是用户线程,而关羽、张飞设置为了守护线程,一旦刘备某天突然挂了,那么关羽和张飞因为当初立下誓约,誓死跟随老大,看到刘备挂了也会同时赴死。
设置守护线程
setDaemon(true),默认为false,注意一定要在线程启动前设置是否为守护线程,否则会抛异常。
下面看例子,三者都是用户线程的情况
public class Demo {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
while (true){
try {
Thread.sleep(1000);
System.out.println("关羽");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
Thread t2 = new Thread(() -> {
while (true){
try {
Thread.sleep(1000);
System.out.println("张飞");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.start();
Thread.sleep(3000);
System.out.println("主线程:刘备挂了");
}
}
打印结果:从结果可看出,如果关羽和张飞都设置为用户线程,那么即便是主线程刘备执行完,他们由于死循环仍然会继续执行。
关羽
张飞
关羽
张飞
主线程:刘备挂了
张飞
关羽
关羽
张飞
......
将关羽、张飞设置为守护线程
public class Demo {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
while (true){
try {
Thread.sleep(1000);
System.out.println("关羽");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.setDaemon(true);
t1.start();
Thread t2 = new Thread(() -> {
while (true){
try {
Thread.sleep(1000);
System.out.println("张飞");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.setDaemon(true);
t2.start();
Thread.sleep(3000);
System.out.println("主线程:刘备挂了");
}
}
打印结果:一旦主线程刘备执行完,用户线程关羽和张飞也不会继续执行,哪怕有死循环。
张飞
关羽
关羽
张飞
主线程:刘备挂了
156

被折叠的 条评论
为什么被折叠?



