【并发编程】Daemon 线程

前言

Github:https://github.com/yihonglei/jdk-source-code-reading(java-concurrent)

Daemon 线程

Daemon 线程(守护线程)是一种支持型线程,主要用于程序中后台调度以及支持工作。

Java 虚拟机退出的条件是 Java 虚拟机中不存在非 Daemon 线程,当存在普通线程,Java 虚拟机不能自动退出。

在线程启动前,可以使用 Thread.setDaemon(true) 将线程设置为 Daemon 线程,启动后在设置无效。

比如常见的守护线程 虚拟机垃圾回收线程,finalizer 线程等。

Daemon 线程主要用于完成支持性工作,但是 Java 虚拟机在退出的时候 Daemon 线程的 finally 语句块不一定会执行,

普通线程是会执行的,可以在里面做一些清除、资源回收等工作。

package com.jpeony.concurrent.thread;

/**
 * 守护线程启动前设置,同时 finally 语句块不一定会执行。
 *
 * @author yihonglei
 */
public class DaemonThread {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new DaemonRunner(), "DaemonRunner");
        // 启动前设置
        t.setDaemon(true);
        t.start();

        Thread.sleep(10);
    }

    public static class DaemonRunner implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    Thread.sleep(1);
                    System.out.println("daemon running...");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.println("daemon finally end");
            }
        }
    }
}

运行结果 

运行Daemon 线程,控制台未打印 finally 语句块内存输出。为什么没执行 finally 语句块?

当 main 线程(非 Daemon 线程)在启动 DaemonRunner 线程后,在 DaemonRunner 执行过程中,main 线程执行完毕,

Java 虚拟机发现已经没有非 Daemon 线程,虚拟机退出,将所有的 Daemon 线程立即停止,所以 DaemonRunner 立即终止,

finally 语句块就没有执行。

所以,不能依靠 Daemon 线程的 finally 语句块中的内容来确保执行关闭或清理资源逻辑。如果要做关闭和清理工作,

需要通过添加钩子完成。比如,Runtime.getRuntime().addShutdownHook(new Thread(// 你的业务线程));

可以用于优雅的关闭线程池。因为在 JVM 销毁之前一定会先执行完钩子线程。不会像 Daemon 线程一样,

让立即停止了。

├─第一阶段 │      源码+ppt.rar │      高并发编程第一阶段01讲、课程大纲及主要内容介绍.wmv │      高并发编程第一阶段02讲、简单介绍什么是线程.wmv │      高并发编程第一阶段03讲、创建并启动线程.mp4 │      高并发编程第一阶段04讲、线程生命周期以及start方法源码剖析.mp4 │      高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │      高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │      高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │      高并发编程第一阶段08讲、构造Thread对象你也许不知道的几件事.mp4 │      高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │      高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │      高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续.mp4 │      高并发编程第一阶段12讲、Daemon线程的创建以及使用场景分析.mp4 │      高并发编程第一阶段13讲、线程ID,优先级讲解.mp4 │      高并发编程第一阶段14讲、Thread的join方法详细介绍,结合一个典型案例.mp4 │      高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │      高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期.mp4 │      高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力结束线程的综合实战.mp4 │      高并发编程第一阶段18讲、数据同步的引入与Synchronized的简单介绍.mp4 │      高并发编程第一阶段19讲、结合jconsole,jstack以及汇编指令认识synchronized关键字.mp4 │      高并发编程第一阶段20讲、同步代码块以及同步方法之间的区别和关系.mp4 │      高并发编程第一阶段21讲、通过实验分析This锁的存在.mp4 │      高并发编程第一阶段22讲、通过实验分析Class锁的存在.mp4 │      高并发编程第一阶段23讲、多线程死锁分析,案例介绍.mp4 │      高并发编程第一阶段24讲、线程间通信快速入门,使用wait和notify进行线程间的数据通信.mp4 │      高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │      高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │      高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │      高并发编程第一阶段28讲、线程生产者消费者的综合实战结合Java8语法.mp4 │      高并发编程第一阶段29讲、如何实现一个自己的显式锁Lock精讲上.mp4 │      高并发编程第一阶段30讲、如何实现一个自己的显式锁Lock精讲下(让锁具备超时功能).mp4 │      高并发编程第一阶段31讲、如何给你的应用程序注入钩子程序,Linux下演示.mp4 │      高并发编程第一阶段32讲、如何捕获线程运行期间的异常.mp4 │      高并发编程第一阶段33讲、ThreadGroup API介绍之一.mp4 │      高并发编程第一阶段34讲、ThreadGroup API介绍之二.mp4 │      高并发编程第一阶段35讲、线程池原理与自定义线程池.mp4 │      高并发编程第一阶段36讲、自定义个简单的线程池并且测试.mp4 │      高并发编程第一阶段37讲、给线程池增加拒绝策略以及停止方法.mp4 │      高并发编程第一阶段38讲、给线程池增加自动扩充线程数量,以及闲时自动回收的功能.mp4 │      高并发编程第一阶段39讲、课程结束,内容回顾,下季内容预告.mp4 │ ├─第二阶段 │       Java并发编程.png │       ppt+源码.rar │       高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │       高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │       高并发编程第二阶段03讲、介绍三种高效优雅的Singleto
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页