1,首先什么是守护线程,什么是非守护线程呢
下面是网上资料总结如下:
Java有两种Thread:“守护线程Daemon”(守护线程)与“用户线程User”(非守护线程)。
从字面上我们很容易将守护线程理解成是由虚拟机(virtual machine)在内部创建的,而用户线程则是自己所创建的。事实并不是这样,任何线程都可以是“守护线程Daemon”或“用户线程User”。他们在几乎每个方面都是相同的,唯一的区别是判断虚拟机何时离开:
用户线程:Java虚拟机在它所有非守护线程已经离开后自动离开。
守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。
守护线程与普通线程的唯一区别是:当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)
当然我们也可以把一个线程设置成一个守护线程 方法就是 对象线程.setDaemon(true);
举个例子:就像 天上人间的保安 (守护线程),里面有牌位姑娘(非守护线程),他们是可以同时干着各自的活儿,但是 姑娘们要是都被JC带走了,那么门口的保安也就没有存在的意义了。
2,下面介绍addShutdownHook方法注册新的虚拟机来关闭钩子
public void addShutdownHook(Thread hook)
Java 虚拟机会为了响应以下两类事件而关闭:
1程序正常退出,这发生在最后的非守护线程退出时,或者在调用 exit(等同于 System.exit)方法时。
2为响应用户中断而终止 虚拟机,如键入 ^C;或发生系统事件,比如用户注销或系统关闭。
关闭钩子 只是一个已初始化但尚未启动的线程。虚拟机开始启用其关闭序列时,它会以某种未指定的顺序启动所有已注册的关闭钩子,并让它们同时运行。运行完所有的钩子后,如果已启用退出终结,那么虚拟机接着会运行所有未调用的终结方法。最后,虚拟机会暂停。注意,关闭序列期间会继续运行守护线程,如果通过调用 exit 方法来发起关闭序列,那么也会继续运行非守护线程。
一旦开始了关闭序列,则只能通过调用 halt 方法来停止这个序列,此方法可强行终止虚拟机。
一旦开始了关闭序列,则不可能注册新的关闭钩子或取消注册先前已注册的钩子。尝试执行这些操作会导致抛出 IllegalStateException。
关闭钩子可在虚拟机生命周期中的特定时间运行,因此应保护性地对其进行编码。特别是应将关闭钩子编写为线程安全的,并尽可能地避免死锁。关闭钩子还应该不盲目地依靠某些服务,这些服务可能已注册了自己的关闭钩子,所以其本身可能正处于关闭进程中。例如,试图使用其他基于线程的服务(如 AWT 事件指派线程)可能导致死锁。
关闭钩子应该快速地完成其工作。当程序调用 exit 时,虚拟机应该迅速地关闭并退出。由于用户注销或系统关闭而终止虚拟机时,底层的操作系统可能只允许在固定的时间内关闭并退出。因此在关闭钩子中尝试进行任何用户交互或执行长时间的计算都是不明智的
分享到:
相关推荐
传统的`Thread.stop`和`Thread.suspend`方法由于存在安全隐患已经被弃用,它们可以中断线程的任意位置,可能会破坏对象的状态,因此不推荐使用。 正确的方法是采用中断(interrupt)这一协作机制。中断是一种信号,...
Java中的后台线程,也称为守护线程(daemon),在程序运行中扮演着重要的角色,尤其是在需要持续提供服务而不需要直接影响程序生命周期的情况下。本文将深入探讨后台线程的概念、其特性以及如何在Java中创建和管理...
书中详细阐述了实现可见性的方法,例如使用volatile关键字标记共享变量以确保其在多线程环境中的可见性。 ##### 3.2 发布与逃逸 发布是指将对象引用从一个线程传递给另一个线程;逃逸则是指对象的引用逃逸出创建它...
ShutdownHook 的实现代码非常简单,只需要使用 Runtime.getRuntime().addShutdownHook(Thread) 方法,并传入一个线程对象,该线程对象将会在 JVM 关闭时被执行。在这个线程对象中,我们可以执行清理操作,例如保存...
推荐使用`interrupt()`方法来请求线程停止,它会设置线程的中断标志,让线程在适当的时候检查这个标志并决定如何响应。 在实际编程中,我们还需要注意避免程序无限制地运行,例如通过设置超时机制或限制循环次数。...
- 在编码过程中要仔细检查所使用的类和方法是否已被标记为过时 (`Deprecated`) 或者未被官方文档记录 (`Undocumented`)。这些方法可能存在未知问题,也可能在未来的JDK版本中被移除。 - 使用`@Deprecated`注解的方法...
它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,从而导致不正确的行为或死锁。 java.lang.Runtime 类提供了访问当前 Java 应用程序的 Runtime 环境的能力,并提供了一些有用的方法来控制 Java ...
- 使用轻量级组件(非本机操作系统控件),因此跨平台性好。 - 支持外观和感觉(LookAndFeel)的自定义,可以模拟不同操作系统的界面风格。 - AWT(Abstract Window Toolkit)的扩展,提供更强大的功能和更好的用户...
- 使用 `catalinaLoader` 加载 `org.apache.catalina.startup.Catalina` 类,并调用其 `process()` 方法。 - 设置共享扩展类的 `loader`。 - 最终将新建的 `Catalina` 实例赋值给 `catalinaDaemon`。 - **...
JDK在1.3之后提供了Java Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在以下几种场景被调用: 1)程序正常退出 2)使用System.exit() 3)终端使用Ctrl+C触发的...
例如,`java.lang.Runtime.addShutdownHook()` 方法可以注册一个线程作为JVM关闭的钩子,当JVM正常退出时,这些钩子线程会被执行,可以用来进行资源清理等操作。 “反射”是Java的一项强大功能,它允许程序在运行时...
RMI泥浆 跑步 make mud rmiregistry java src.MUDServerMainline <registry> ... 处理用户离开/加入服务器或 MUD,使用MUDServerMainline的shutdownhook MUDServerMainline和服务器端方法playerDisconnect
3. 当所有的非守护线程(non-daemon threads)都结束时,JVM也会退出。 4. 用户注销或系统关机,这取决于操作系统和JVM的集成方式。 值得注意的是,虽然`shutdown hook`提供了在JVM退出前执行清理操作的能力,但...
Java中提供了`java.lang.Process`类的`destroy()`方法和`destroyForcibly()`方法来发送信号,以及`java.lang.Runtime`类的`addShutdownHook()`方法来处理系统退出信号。 4. **消息队列(Message Queue)**: 消息...
### Tomcat技术培训知识点概述 #### 一、Tomcat简介及背景 - **Tomcat**:是由Apache软件基金会下属的Jakarta项目开发的一款免费开源的轻量级Servlet容器。...这对于理解如何高效地使用和管理Tomcat服务器至关重要。
例如,在上面的代码中,当使用`Runtime.getRuntime().addShutdownHook()`方法注册了一个新的线程,当接收到系统关闭信号时,这个钩子函数会被调用,从而允许执行一些清理工作,如关闭数据库连接、资源释放等。...
【关闭钩子详解】 在Java编程中,"关闭钩子"是一种重要的机制,它允许开发者在应用程序退出或中断时...在实际开发中,正确地使用和设计关闭钩子,能够有效地处理程序关闭时可能出现的各种情况,保证程序的优雅退出。
- 在Java中,`Runtime.addShutdownHook()`方法用于注册一个线程作为关闭钩子。当JVM接收到退出信号时,这些钩子会被执行。 - 关闭钩子的执行顺序是不确定的,因此不应依赖它们之间的相对执行时间。 2. **Tomcat中...
- 对于多线程应用,`ExecutorService`提供`shutdown()`和`shutdownNow()`方法来停止工作线程。`shutdown()`等待所有已提交的任务执行完毕,而`shutdownNow()`尝试停止所有正在执行的任务。 7. **Docker容器中的...
5. **Java进程管理**:Java程序可以通过注册信号处理器来响应操作系统信号,例如使用`java.lang.UNIXProcess`类的`addShutdownHook()`方法或第三方库如`org.apache.commons.daemon.Daemon`接口。 6. **开源社区**:...