Runtime.addShutdownHook的用法
原文出处:http://kim-miao.iteye.com/blog/1662550。感谢作者的无私分享。
一.Runtime.addShutdownHook理解
在看别人的代码时,发现其中有这个方法,便顺便梳理一下。
void java.lang.Runtime.addShutdownHook(Thread hook)
该方法用来在jvm中增加一个关闭的钩子。当程序正常退出,系统调用 System.exit方法或虚拟机被关闭时才会执行添加的shutdownHook线程。其中shutdownHook是一个已初始化但并不有启动的线程,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以可通过这些钩子在jvm关闭的时候进行内存清理、资源回收等工作。
二.示例代码
- public class TestRuntimeShutdownHook {
- public static void main(String[] args) {
- Thread shutdownHookOne = new Thread() {
- public void run() {
- System.out.println("shutdownHook one...");
- }
- };
- Runtime.getRuntime().addShutdownHook(shutdownHookOne);
- Runnable threadOne = new Runnable() {
- public void run() {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("thread one doing something...");
- }
- };
- Runnable threadTwo = new Thread() {
- public void run() {
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("thread two doing something...");
- }
- };
- threadOne.run();
- threadTwo.run();
- }
- }
输出如下:
- thread one doing something...
- thread two doing something...
- shutdownHook one...
我在这里附上JDK api上关于这个方法的说明,看这个api觉得有点绕。
=========================================================================================================
addShutdownHook
public void addShutdownHook(Thread hook)
- 注册新的虚拟机来关闭钩子。
Java 虚拟机会为了响应以下两类事件而关闭:
- 程序正常退出,这发生在最后的非守护线程退出时,或者在调用
exit(等同于System.exit)方法时。或者, - 为响应用户中断而终止 虚拟机,如键入 ^C;或发生系统事件,比如用户注销或系统关闭。
关闭钩子 只是一个已初始化但尚未启动的线程。虚拟机开始启用其关闭序列时,它会以某种未指定的顺序启动所有已注册的关闭钩子,并让它们同时运行。运行完所有的钩子后,如果已启用退出终结,那么虚拟机接着会运行所有未调用的终结方法。最后,虚拟机会暂停。注意,关闭序列期间会继续运行守护线程,如果通过调用
exit方法来发起关闭序列,那么也会继续运行非守护线程。一旦开始了关闭序列,则只能通过调用
halt方法来停止这个序列,此方法可强行终止虚拟机。一旦开始了关闭序列,则不可能注册新的关闭钩子或取消注册先前已注册的钩子。尝试执行这些操作会导致抛出
IllegalStateException。关闭钩子可在虚拟机生命周期中的特定时间运行,因此应保护性地对其进行编码。特别是应将关闭钩子编写为线程安全的,并尽可能地避免死锁。关闭钩子还应该不盲目地依靠某些服务,这些服务可能已注册了自己的关闭钩子,所以其本身可能正处于关闭进程中。例如,试图使用其他基于线程的服务(如 AWT 事件指派线程)可能导致死锁。
关闭钩子应该快速地完成其工作。当程序调用
exit时,虚拟机应该迅速地关闭并退出。由于用户注销或系统关闭而终止虚拟机时,底层的操作系统可能只允许在固定的时间内关闭并退出。因此在关闭钩子中尝试进行任何用户交互或执行长时间的计算都是不明智的。与其他所有线程一样,通过调用线程
ThreadGroup对象的uncaughtException方法,可在关闭钩子中处理未捕获的异常。此方法的默认实现是将该异常的堆栈跟踪打印至System.err并终止线程;它不会导致虚拟机退出或暂停。仅在很少的情况下,虚拟机可能会中止,也就是没有完全关闭就停止运行。虚拟机被外部终止时会出现这种现象,比如在 Unix 上使用 SIGKILL 信号或者在 Microsoft Windows 上调用 TerminateProcess。如果由于内部数据结构损坏或试图访问不存在的内存而导致本机方法执行错误,那么可能也会中止虚拟机。如果虚拟机中止,则无法保证是否将运行关闭钩子。
- 程序正常退出,这发生在最后的非守护线程退出时,或者在调用
-
- 参数:
hook- 一个已初始化但尚未启动的Thread对象- 抛出:
IllegalArgumentException- 如果指定的钩子已注册,或者可以确定钩子正在运行或者已运行完毕IllegalStateException- 如果虚拟机已经处于关闭进程中SecurityException- 如果安全管理器存在并且拒绝RuntimePermission("shutdownHooks")
Runtime.addShutdownHook的用法的更多相关文章
- Runtime.addShutdownHook用法
一.什么是ShutdownHook? 在Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源.平滑退出的功能. 使用Runtime.addShutdownHook(Thread hook)方法 ...
- RunTime的一些用法
RunTime的一些用法 RunTime简介 RunTime简称运行时.OC就是运行时机制,其中最主要的是消息机制 对于OC来说,在编译的时候并不能决定真正调用哪个函数,只有真正运行时才会根据函数 ...
- 利用 java.lang.Runtime.addShutdownHook() 钩子程序,保证java程序安全退出
以前在开发时只知道依靠数据库事务来保证程序关闭时数据的完整性. 但有些时候一个业务上要求的原子操作,不一定只包括数据库,比如外部接口或者消息队列.此时数据库事务就无能为力了. 这时我们可以依靠java ...
- Runtime.addShutdownHook()(译)
序言: 每一个Java程序都可以为JVM增加一个关闭钩子.JVM将在关闭之前执行关闭钩子中的指令. 问题: 一个程序可能需要在退出前执行一些指令.程序可能由于下列原因而退出: 所有的线程已经执行完毕 ...
- RunTime.getRunTime().addShutdownHook的用法
今天在阅读Tomcat源码的时候,catalina这个类中使用了下边的代码,不是很了解,所以google了一下,然后测试下方法,Tomcat中的相关代码如下: Runtime.getRuntime() ...
- addShutdownHook的用法
addShutdownHook作为一个正常关闭Java程序的途径,其实是非常有用的. 有JDK文档可知,当程序正常退出,或者为响应用户中断而终止虚拟机的时候,就会调用里面的线程,来作最后的退出处理. ...
- Runtime 10种用法
来源:haojingxue_iOS 链接:http://www.jianshu.com/p/3182646001d1 阅读了多篇运行时的文章,感觉都很不错,从几篇文章里面提取一些个人认为比较重要的,偏 ...
- Java Runtime.exec()用法
转自:https://www.cnblogs.com/mingforyou/p/3551199.html Java Runtime.exec()的使用 Sun的doc里其实说明还有其他的用法: exe ...
- 关于jvm钩子 Runtime.getRuntime().addShutdownHook
转自: http://www.cnblogs.com/nexiyi/p/java_add_ShutdownHook.html 在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候 ...
随机推荐
- DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入
0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...
- 某xss挑战赛闯关笔记
0x0 前言 在sec-news发现先知上师傅monika发了一个xss挑战赛的闯关wp([巨人肩膀上的矮子]XSS挑战之旅---游戏通关攻略(更新至18关)https://xianzhi.aliyu ...
- PyQt4 模拟记事本基本功能(保存,打开文件)
完成功能: 1. 默认[保存]按钮enable 2. 修改文本的内容后,[enable] 3. 解决字符乱码问题:utf-8 4. 提示:如果修改了文件没有保存的时候,又尝试打开新的文件,给出相关的提 ...
- jquery 获取URL相对/绝对路径问题
在B/s系统中,使用jquery做图片上传时通常会遇到获取不到路径的的问题,这是因为系统不允许浏览器的访问而进行限制造成的, 一般获取到的都是C://Program Files/~/文件位置.而在有时 ...
- Chris Richardson微服务翻译:构建微服务之使用API网关
Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关(本文) 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...
- 微信小程序demo-环球小镇
微信小程序-环球小镇说明:实现了环球小镇(huanqiuxiaozhen.com)移动端商城客户端部分功能,包括首页,分类,购物车,帐户,品牌列表,商品详情等功能. 项目下载:http://bb ...
- Timus Online Judge:ural:1006. Square Frames
原题链接:http://acm.timus.ru/problem.aspx?space=1&num=1006 看到题第一反应:这玩意怎么读入…… 本地的话因为是全角字符,会占两个位置,所以需要 ...
- 51Nod 1004 n^n的末位数字(日常复习快速幂,莫名的有毒,卡mod值)
1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数N,输出 ...
- HDU2824-The Euler function-筛选法求欧拉函数+求和
欧拉函数: φ(n)=n*(1-1/p1)(1-1/p2)....(1-1/pk),其中p1.p2-pk为n的所有素因子.比如:φ(12)=12*(1-1/2)(1-1/3)=4.可以用类似求素数的筛 ...
- NYoj_49开心的小明
开心的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他 ...