版权声明:本文为博主原创文章,转载请注明出处 浅然的专栏 https://blog.csdn.net/w_linux/article/details/82714257
该篇博客笔者不准备用条条框框来让博文显得规整了,直接码字!
笔者最近在看Java多线程编程,在守护线程与非守护线程的相关理解上感觉值得深入,该篇博客就简单聊聊Java中的守护线程与非守护线程吧
首先看下哪些是守护线程,哪些是非守护线程
所谓的主线程就是Java中的main方法,gc线程是指Java垃圾回收中的线程,用户线程是指用户自定义的线程
当主线程结束了,gc线程也会销毁,但是非守护线程却不受影响,看看下面demo你就知道了
/**
* @author: linjie
* @description:守护线程与非守护线程
* @create: 2018/09/15 11:13
*/
public class Guard {
public static void main(String[] args){
//创建用户线程(非守护线程)
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
for (int i = 0; i < 90; i++){
System.out.println("用户线程"+i);
}
}
});
thread.start();
//主线程(守护线程)
for (int i = 0; i < 5; i++){
System.out.println("主线程"+i);
}
System.out.println("主线程执行完毕");
}
}
运行结果如下,可以看出,即使主线程结束了,用户线程(非守护线程)还是在执行,所以可以得出非守护线程和主线程互不影响
利用thread.setDaemon(true)方法可以将非守护线程变成守护线程
/**
* @author: linjie
* @description:守护线程与非守护线程
* @create: 2018/09/15 11:13
*/
public class Guard {
public static void main(String[] args){
//创建用户线程(非守护线程)
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
for (int i = 0; i < 90; i++){
System.out.println("用户线程"+i);
}
}
});
try{
//将thread用户线程变成守护线程
thread.setDaemon(true);
thread.start();
}catch (Exception e){
e.printStackTrace();
}
//主线程(守护线程)
for (int i = 0; i < 5; i++){
System.out.println("主线程"+i);
}
System.out.println("主线程执行完毕");
}
}
运行结果如下
你会发现,为什么既然已经变为守护线程了,却没有和主线程一起结束呢?
原因是:结束线程有延迟,所以在结束线程的期间发生了还在进行“用户线程”的问题,解决办法就是在用户线程中加sleep休眠(暂停执行)即可
/**
* @author: linjie
* @description:守护线程与非守护线程
* @create: 2018/09/15 11:13
*/
public class Guard {
public static void main(String[] args){
//创建用户线程(非守护线程)
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
for (int i = 0; i < 90; i++){
try {
//休眠,每隔300mm执行一次
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("用户线程"+i);
}
}
});
try{
//将thread用户线程变成守护线程
thread.setDaemon(true);
thread.start();
}catch (Exception e){
e.printStackTrace();
}
//主线程(守护线程)
for (int i = 0; i < 5; i++){
System.out.println("主线程"+i);
}
System.out.println("主线程执行完毕");
}
}
运行结果和我们期望的一样