这里我不知道如何解释优雅一词
先看如下代码:
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提供的并发工具和API,解决实际开发中的多线程问题,提高软件的性能和稳定性。这是一本值得每一位Java开发者研读的书。
总之,Java的多线程和并发编程是一个复杂而重要的主题,它涉及到操作系统原理、JVM行为、线程管理、同步机制等多个方面,熟练掌握这些知识对于开发高效、可靠的Java应用程序至关重要。通过理解线程的工作原理和使用...
在Java编程语言中,多线程是其一个重要的高级特性,它使得程序可以在同一时间执行多个不同的任务,从而提高了程序的效率和响应性。在这个"Java高级特性 - 多线程练习题.zip"中,我们可以看到两个文件,分别是"顺序...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,从而提高了CPU资源的利用率。...不断学习和掌握新的并发编程技术,才能更好地适应Java平台的发展,编写出高效、稳定的多线程应用程序。
最后,Java并发编程还涉及线程池的使用,通过预先创建一定数量的线程,避免频繁创建和销毁线程带来的开销。`ExecutorService`是线程池的接口,可以使用`Executors`工厂类创建不同类型的线程池,如固定大小线程池、可...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
Java并发编程专题(一)----线程基础知识 本文主要介绍了Java并发编程线程的基础知识,旨在帮助大家更好地学习JAVA并发编程。下面将详细讲解线程的基础知识。 一、线程的状态 在Java中,线程的状态可以分为五种:...
### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程可以通过实现Runnable接口或继承Thread类来创建。下面我们将深入探讨Java多线程编程的...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
Java并发多线程是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类、`Runnable`接口以及`ExecutorService`来实现。下面我们将深入探讨...
在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。《Java多线程编程实例》这本书深入浅出地探讨了Java中的多线程编程,通过丰富的实例帮助读者...
在Java编程中,多线程是程序设计中的一个重要概念,特别是在并发处理和系统优化中扮演着关键角色。本文将深入探讨Java中多线程的基础知识,主要包括如何创建和管理线程,以及如何停止线程。 首先,让我们了解如何在...
Java中的多线程是编程中一个重要的概念,尤其在大数据处理和并发操作中不可或缺。Java提供了两种主要的方式来创建和管理线程:继承`Thread`类和实现`Runnable`接口。 **1. 继承Thread类实现多线程** 当你创建一个...
Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
### Java并发编程基础知识点 #### 一、线程与线程状态 - **线程基本概念**: - 在Java中,线程是程序执行流的最小单元,它由一个线程体(实现Runnable接口或者继承Thread类)和数据组成。 - **线程创建**:可以...
总的来说,Java多线程与并发编程是软件开发中不可或缺的部分,它涉及操作系统原理、JVM行为以及Java语言特性。掌握这部分知识,开发者可以编写出更加高效、健壮的并发程序,应对现代计算环境中的挑战。
Java多线程与并发编程是Java开发中不可或缺的一部分,它涉及到如何高效地处理多个执行单元,使得程序在多核或多处理器环境下能同时运行。以下是对Java多线程、并发编程的一些关键知识点的详细阐述: 1. **线程创建*...