守护线程

线程分为用户线程和守护线程

守护线程是用来守护用户线程的

守护线程可以用来做一些记录日志,监控内存,垃圾回收等工作

daemon属性

Thread类中有一个daemon属性,默认值为false,也就是非守护线程,即用户线程,当daemon值为true时,该线程为守护线程

private boolean daemon = false;
设置守护线程

Thread类提供了setDaemon(boolean)方法,设置daemon值为true即将线程设置为守护线程

public final void setDaemon(boolean on)
查看线程是否为守护线程

Thread类提供了isDaemon()方法获取daeman属性的值

public final boolean isDaemon() {
    return daemon;
}
守护线程伴随着用户线程存在
// 定义一个守护线程
Thread thread1 = new Thread(new Runnable() {
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("我是一个守护线程!!!");
        }
    }
});
// 设置成守护线程
thread1.setDaemon(true);
// 启动守护线程
thread1.start();
// 定义一个用户线程
new Thread(new Runnable() {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("我是用户线程!");
        }
        System.out.println("用户线程执行完毕!");
    }
}).start();

运行结果

我是一个守护线程!!!
我是用户线程!
我是用户线程!
我是一个守护线程!!!
我是用户线程!
我是一个守护线程!!!
我是一个守护线程!!!
我是用户线程!
我是一个守护线程!!!
我是用户线程!
我是一个守护线程!!!
我是用户线程!
我是一个守护线程!!!
我是用户线程!
我是用户线程!
我是一个守护线程!!!
我是一个守护线程!!!
我是用户线程!
我是用户线程!
用户线程执行完毕!
我是一个守护线程!!!

代码中守护线程是死循环,但是守护线程自己停下来了

可以看出,守护线程会随着用户线程执行完毕而完成自己的使命,可能在用户线程执行完立即停止,也可能执行一段时间后停止,总之用户线程不在了,守护线程会自动销毁。

上一篇:页面图片懒加载、延迟加载(lazyload)


下一篇:守护线程 线程t.daemon=True