黑马程序员技术交流社区

标题: 【上海校区】什么是守护线程,它和非守护线程有什么区别 [打印本页]

作者: zhangsan0716    时间: 2020-6-5 17:34
标题: 【上海校区】什么是守护线程,它和非守护线程有什么区别
守护线程:当程序只剩下守护线程的时候,程序就会自动退出。
守护线程的作用类似于后台静默执行的程序
例如JVM的垃圾回收线程
当主线程运行的时候,垃圾回收线程一起运行;
当主线程销毁,垃圾回收线程会和主线程一起销毁。


非守护线程(用户线程):如果主线程销毁,用户线程继续运行,且互不影响。

守护线程与非守护线程代码演示
守护线程:主线程销毁停止,守护线程一起销毁
[Java] 纯文本查看 复制代码
public static void main(String[] args) {
                Thread t1 = new Thread(new Runnable() {
                       
                        public void run() {
                                while (true) {
                                        try {
                                                Thread.sleep(1000);

                                        } catch (Exception e) {
                                                // TODO: handle exception
                                        }
                                        System.out.println("我是子线程(用户线程)");
                                }
                        }
                });
                // 标识当前方法为守护线程,一定要在启动线程前设置为守护线程
                t1.setDaemon(true);
                //启动线程
                t1.start();
               
                //相当与主线程
                for (int i = 0; i < 10; i++) {
                        try {
                                Thread.sleep(300);
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                        System.out.println("main:i:" + i);
                }
                System.out.println("主线程执行完毕...");
        }

主线程结束之后并没有在继续运行守护线程,守护线程也跟着结束,一起销毁停止。

非守护线程:如果主线程销毁,用户线程继续运行且互不影响。
[Java] 纯文本查看 复制代码
public static void main(String[] args) {
                Thread t1 = new Thread(new Runnable() {
                       
                        public void run() {
                                while (true) {
                                        try {
                                                Thread.sleep(1000);

                                        } catch (Exception e) {
                                                // TODO: handle exception
                                        }
                                        System.out.println("我是子线程(用户线程)");
                                }
                        }
                });
                //启动线程
                t1.start();
               
                //相当与主线程
                for (int i = 0; i < 10; i++) {
                        try {
                                Thread.sleep(300);
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                        System.out.println("main:i:" + i);
                }
                System.out.println("主线程执行完毕...");
        }

当主线程销毁停止,非守护线程(用户线程)并没有结束,而是一直在执行,与主线程互不影响。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2