聊聊Java中的守护线程与非守护线程

版权声明:本文为博主原创文章,转载请注明出处 浅然的专栏 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("主线程执行完毕");

    }

}

运行结果和我们期望的一样

猜你喜欢

转载自blog.csdn.net/w_linux/article/details/82714257
今日推荐