多线程学习笔记(三)--用户线程和守护线程

阐述

Java线程中有两种线程:①用户线程 ②守护线程

用户线程:平时用到的普通线程均是用户线程

守护线程:指在程序运行的时候在后台提供一种通用服务的线程,守护线程是为用户线程服务的,当有用户线程在运行,那么守护线程同样需要工作,当所有的用户线程都结束时,守护线程也就会停止

守护线程使用方式

  • 设置线程的Daemon为true,且必须在thread.start()之前设置
  • Daemon线程中产生的新线程也是Daemon
  • 守护线程不应该去访问固有资源,如进行读写操作(文件,数据库),因为守护线程是跟随用户线程的,当没有用户线程工作时,守护线程会立即结束

举例

  • 没有守护线程时
public class Daemon {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("守护线程 线程结束...");
            }
        });
//        thread.setDaemon(true);    //①
        thread.start();
        System.out.println("用户线程 结束...");
    }
}

运行结果:

证明当用户线程全部结束时,守护线程依旧可以执行


  • 有守护线程时
public class Daemon {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("守护线程 线程结束...");
            }
        });
        thread.setDaemon(true);    //①
        thread.start();
        System.out.println("用户线程 结束...");
    }
}

运行结果:

当所有的用户线程结束时,守护线程就结束了,不会继续执行


守护线程适用场景

  • 不适合用于输入输出或计算操作
  • 适用于辅助用户线程场景,如GC,内存管理

猜你喜欢

转载自blog.csdn.net/zh15732621679/article/details/80150033