随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

理解:

我们知道,进程可以理解为一个公司,而线程则可以理解为公司的员工,当需要进行某个功能的执行时,公司就会启动运作,公司中的员工就各司其职进行工作,那么守护线程怎么理解呢?

通过字面意思可以这样理解,既然是守护,那么肯定守护线程是与被守护的线程同时存在且同时工作,如果被守护的员工(线程)死亡(停止),那么守护的工作就没必要进行下去了,因为没有需要被守护的员工(线程)了。

在整个JVM里面最大的守护线程就是GC线程,程序执行过程中GC线程会一直存在,如果程序执行完毕,GC线程也会停止。

Thread类中有方法:

- 设置为守护线程: public final void setDaemon( boolean on);

- 判断是否为守护线程: public final boolean isDaemon();

测试代码:

未使用方法设置守护线程时、

public class Main {
    public static void main(String[] args){
        Thread userThread = new Thread(()->{
            for (int x = 1; x < 100; x++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "线程正在运行第 " + x + "次!!!");
            }
        },"用户");    // 完成核心业务
        Thread deamonThread = new Thread(()->{
            for (int x = 1; x < 100; x++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "线程正在运行第 " + x + "次!!!");
            }
        },"守护");
        userThread.start();
        deamonThread.start();

    }
}

输出结果:

线程交替执行。

并且当用户线程的运行次数少于守护线程时,当用户线程运行完后,守护线程会继续运行。

但是设置守护线程后

package Demo_2_2_线程守护;

public class Main {
    public static void main(String[] args){
        Thread userThread = new Thread(()->{
            for (int x = 1; x < 10; x++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "线程正在运行第 " + x + "次!!!");
            }
        },"用户");    // 完成核心业务
        Thread deamonThread = new Thread(()->{
            for (int x = 1; x < 100; x++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "线程正在运行第 " + x + "次!!!");
            }
        },"守护");
        deamonThread.setDaemon(true);  // 设置为守护线程
        userThread.start();
        deamonThread.start();

    }
}

输出结果:

 

 

posted on 2022-02-02 16:02  时间完全不够用啊  阅读(146)  评论(0)    收藏  举报