这里我不知道如何解释优雅一词
先看如下代码:
public class DaemonThread { public static void main(String[] args) { final Thread t = new Thread() { @Override public void run() { System.out.println("线程working, 并休息20秒"); try { Thread.sleep(1000 * 20); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程finish"); } }; // t.setDaemon(true);//设置为守护线程, 不设置默认为用户线程 t.start(); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { while (t.isAlive()) { try { Thread.sleep(1000 * 1); System.out.println("业务线程还没处理完, 请等待"); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("业务线程执行完毕, JVM退出"); } }); System.out.println("主线程执行完毕,等待其他用户线程执行完毕后退出"); } }
正常运行结果如下:
$ java DaemonThread 线程working, 并休息20秒 主线程执行完毕,等待其他用户线程执行完毕后退出 线程finish 业务线程执行完毕, JVM退出
假如我在该进程运行结束前执行kill 进程号. 那么t线程的任务仍然会执行. 执行完后JVM正常退出.
运行结果如下:
$ java DaemonThread 线程working, 并休息20秒 主线程执行完毕,等待其他用户线程执行完毕后退出 业务线程还没处理完, 请等待 业务线程还没处理完, 请等待 业务线程还没处理完, 请等待 业务线程还没处理完, 请等待 业务线程还没处理完, 请等待 业务线程还没处理完, 请等待 业务线程还没处理完, 请等待 业务线程还没处理完, 请等待 业务线程还没处理完, 请等待 业务线程还没处理完, 请等待 业务线程还没处理完, 请等待 线程finish 业务线程还没处理完, 请等待 业务线程执行完毕, JVM退出
关键代码如下
Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { while (t.isAlive()) { try { Thread.sleep(1000 * 1); System.out.println("业务线程还没处理完, 请等待"); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("业务线程执行完毕, JVM退出"); } });
如果 没有这段代码, 在运行kill 进程时, JVM就会立即退出进程.不会等待线程t执行完.
相关推荐
java面试 杭州-蚂蚁金服-Java高级 java并发编程、JVM等
01大数据面试复习----Java基础---集合类、多线程、JVM.zip
第2章介绍Java并发编程的底层实现原理,介绍在CPU和JVM这个层面是如何帮助Java实现并发编程的。 第3章介绍深入介绍了Java的内存模型。Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,本...
它选取了Java并发编程中最核心的技术进行讲解,从JDK源码、JVM、CPU等多角度全面剖析和讲解了Java并发编程的框架、工具、原理和方法,对Java并发编程进行了最为深入和透彻的阐述。 《Java并发编程的艺术》内容涵盖...
java_java面试题库整理_基础_JVM_线程并发_框架等.zip
并发编程:编写多线程代码,解决多线程带来的问题 为什么要学并发编程? 首先,来看一个案例:手写网站服务器案例。 高性能应用程序的一把钥匙,应用程序的翅膀,面试高频的考点 中间件几乎都是多线程应用:MySQL、...
它选取了Java并发编程中最核心的技术进行讲解,从JDK源码、JVM、CPU等多角度全面剖析和讲解了Java并发编程的框架、工具、原理和方法,对Java并发编程进行了最为深入和透彻的阐述。, 《Java并发编程的艺术》内容涵盖...
java 查看JVM中所有的线程的活动状况 java 查看JVM中所有的线程的活动状况
本书的读者是那些具有一定Java编程经验的程序员、希望了解Java SE 5,6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。 目录 代码清单 序 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的...
Java并发编程.pdf JAVA核心知识点整理.pdf Java高级架构知识点整理.pdf Java高级架构面试知识点整理.pdf JVM与性能优化知识点整理.pdf MySQL性能调优与架构设计解析文档.pdf Nginx入门到实战.pdf springCloud笔记....
本书从并发处理的视角探讨Java编程。首先详细介绍了并发应用程序的设计原理,阐述了如何对串行算法进行并行化处理。然后介绍了Thread类和Runnable接口,它们是Java并发API的重要组成部分。接着讨论了如何利用Java...
│ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....
java jvm 参数 -Xms -Xmx -Xmn -Xss -
第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: ...
详细介绍java并发编程相关知识: 基础知识 并发与并行 Java并发演进历史 Java并发模型 线程模型 存储模型 JVM同步原语 volatile CAS 线程安全 保护“共享数据” 低级并发工具 原子变量 锁...
Java并发编程最全面试题 123道.pdf Java并发编程面试题 75题.pdf JAVA核心面试知识点整理.pdf Java垃圾收集必备手册.pdf Java虚拟机(JVM)面试题 51道.pdf SpringBoot面试题 30道.pdf Spring面试题(含答案).pdf ...