本篇会用两个例子讲清楚setDaemon的作用
你只需要记住这几个点:
⚡️ 当你新建一个线程的时候,daemon值默认为false
⚡️ 当没有daemon值为false的线程存活的时候,JVM会退出,这个线程也会
⚡️ daemon为false的时候,称之为用户线程,为true的时候,称之为守护线程
例子1,守护线程的何时终止?作用?:
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("----");
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.setDaemon(true);
thread.start();
Thread.sleep(10000);
System.out.println("main out");
}
- 结合上面的代码和下面的图,新建的线程一个while(true)的循环,每0.3s打印一次,而且会一直打印,主线程10s后退出但是伴随着main线程的退出,原本该一直打印的“—”却没有打印了,则说明线程终止了,JVM退出了
例子2,守护线程和用户线程的关系?:
public static void main(String[] args) {
Thread user = new Thread(new Runnable() {
@Override
public void run() {
int i = 10;
while (true) {
if(i-- == 0) break;
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("user");
}
}
});
user.start();
Thread daemon = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("daemon");
}
}
});
daemon.setDaemon(true);
daemon.start();
System.out.println("main out");
}
- 结合上面的代码和下面的图,代码里面,我创建了一个用户线程和守护线程,交替打印,并且均while(true),用户线程有个打印10次就退出的开关,我们可以看下图的结果,当main线程退出之后,并没有出现例子1中守护线程退出,JVM也退出的结果,而且用户线程和守护线程一直在进行打印的过程,当用户线程10次打印完了之后,用户线程(被break了)和守护线程同时退出,并且JVM也退出
⚡️ 上面的例子说明了:
⚡️ 守护线程会伴随着最后一个用户进程一起退出,即不存在用户进程时,和JVM一起退出
⚡️ 不指定的话,默认线程是用户进程