java守护线程与非守护线程
代码逻辑
代码里面包括:主线程、用户线程、守护线程。其中主线程和用户线程都属于非守护线程。
当前网上结论
1、主线程结束,守护线程跟着结束
2、只要存在任何一个非守护线程,守护线程就全部工作
测试代码
第一段代码
public class Daemon1 {
public static void main(String[] args) {
System.out.println("主线程开始");
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.setDaemon(true);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<15;i++){
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("用户线程:"+i);
}
System.out.println("用户线程结束!!");
}
});
daemon.start();
System.out.println("守护线程状态:"+daemon.isAlive());
thread.start();
for(int i=0;i<10;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程:"+i);
}
System.out.println("主线程结束!!");
}
}
返回结果:
主线程结束,守护线程依然在执行,在用户线程执行完毕之后,守护线程才结束运行,所以网上第一种说法是错误的!
第二段代码
public class Daemon {
public static void main(String[] args) {
System.out.println("主线程开始");
Thread daemon = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10;i++){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("守护线程:"+i);
}
System.out.println("守护线程结束!!");
}
});
daemon.setDaemon(true);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<15;i++){
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("用户线程:"+i);
}
System.out.println("用户线程结束前守护线程状态:"+daemon.isAlive());
System.out.println("用户线程结束!!");
}
});
daemon.start();
System.out.println("守护线程状态:"+daemon.isAlive());
thread.start();
for(int i=0;i<15;i++){
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程:"+i);
}
System.out.println("主线程结束前守护线程状态:"+daemon.isAlive());
System.out.println("主线程结束!!");
}
}
返回结果:
主线程和用户线程都在执行,但是守护线程已经结束了,所以第二种说法也是错误的。
结论
- 当全部“非守护线程”结束时会中断正在运行的“守护线程”;
- “守护线程”的结束不会影响到“非守护线程”的执行。