Java守护线程

什么是守护线程

Java中的线程分为两类:用户线程(User Thread)、守护线程(Daemon Thread),守护线程有点类比于操作系统层面的守护进程 ,而操作系统层面本身是没有守护线程的定义的,这个是JVM定义出来的。守护线程是守护JVM中的其他线程,所以当如果其他线程不存在时,守护线程也会随之停止,意在伴随着JVM的关闭也销毁,比如常说的GC线程。

看一个简单的例子

public class Main {
    public static void main(String[] args) {
        //守护线程
        Thread daemonThread = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("daemon thread:" + i);
                sleep();
            }
        });
        daemonThread.setDaemon(true);
        daemonThread.start();
        //用户线程
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("common thread:" + i);
                sleep();
            }
        }).start();
        //主线程
        for (int i = 0; i < 2; i++) {
            System.out.println("main thread:" + i);
            sleep();
        }
    }

    private static void sleep() {
        try {
            Thread.sleep(100L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

执行结果

daemon thread:0
main thread:0
common thread:0
main thread:1
daemon thread:1
common thread:1
common thread:2
daemon thread:2
daemon thread:3
common thread:3
common thread:4
daemon thread:4

1)主线程执行完了,普通子线程仍然在执行

2)普通子线程执行完了,守护线程也相继停止了

3)JVM退出不会Care守护线程是否接受

基本特性

1)所有用户线程结束后,JVM直接关闭,不会等待守护线程

2)setDaemon() 必须在start()方法前调用,否者会报错

3)线程的daemon 属性默认继承于父线程,即守护线程创建出来的线程也是守护线程

4)和线程本身优先级没有关系,线程prioritydaemon是两个独立的特性(看官方文档没有指出之间有什么联系

使用场景

后台线程一般用于执行一些辅助型的后台任务:

  • 典型的Java GC线程
  • 手机系统监控信息
  • 监听网络请求或者异步任务

参考

JVM安全退出机制

什么是守护进程

Java的守护进程和非守护进程

daemon-thread-use-case

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。