`
chenhua_1984
  • 浏览: 1255553 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

java虚拟机关闭钩子

    博客分类:
  • java
阅读更多

  java.lang.Runtim类提供了addShutdownHook(Thread hook)方法,用来添加虚拟机关闭的钩子。

 

用途

1应用程序正常退出,在退出时执行特定的业务逻辑

 

2虚拟机非正常退出,比如用户按下ctrl+c,操作系统关闭等。在退出时执行必要的挽救措施。

 

实例:

public class TestOnExit {
    public TestOnExit(){
        doShutDownWork();
    }
    private void doShutDownWork(){
        Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run(){
                System.out.println("application will exit ....");
            }
        });
    }
    public static void main(String[] args) {
        TestOnExit exit=new TestOnExit();
        long beginTime=System.currentTimeMillis();
        for(int i=0;i<10;i++){
            try {
                System.out.println("application run the "+i+"ci");
                Thread.sleep(10000);
               
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
           
        }
        long endTime=System.currentTimeMillis();
        System.out.println("it speat time ..is "+(endTime-beginTime));
    }

}
可以做个测试,首先正常运行


 

执行ctrl+c


然后再试试kill -9 ,

但是遇到kill -9 命令就不行了,所以这个东西还是不很稳定。可用性不高!

kill -9 命令直接就把窗口关掉了,很暴力

我又试了下kill -15 这个,发现是可以的。截个图上来。




 
 然后看运行的结果



 是执行了钩子函数的

 

  • 大小: 31.3 KB
  • 大小: 8.9 KB
  • 大小: 55 KB
  • 大小: 16.7 KB
分享到:
评论
10 楼 psuqqvfp 2010-06-05  
很好,但有些情况楼上的都说了,感觉再完善一下会更好
9 楼 chenhua_1984 2010-06-04  
pujia12345 写道
操作系统来不及通知虚拟机就Over的情况下,这个是没有用处的

对,直接断电就不行
8 楼 pujia12345 2010-06-04  
操作系统来不及通知虚拟机就Over的情况下,这个是没有用处的
7 楼 chenhua_1984 2010-06-04  
tzm1984 写道
kill -9 是不行的
kill还有别的一些参数,kill -非9 应该能用到 哈哈


试了下kill -15 这个是可以的,你说的对。
6 楼 tzm1984 2010-06-04  
kill -9 是不行的
kill还有别的一些参数,kill -非9 应该能用到 哈哈
5 楼 hankesi2000 2010-06-04  
kill -9 肯定是不行的,强制关闭了,不属于楼上说的两种情况
4 楼 beneo 2010-06-04  
chenhua_1984 写道
beneo 写道
难道你希望停电或者死机的时候,还能执行钩子里面的代码么?

停电肯定是不可能执行的了,关机这个我还没测试过的!呵呵,感觉这个东西并非到处都适用!

至于正常关机这种情况我今天测试一下看看!



The Java virtual machine shuts down in response to two kinds of events:


The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or

The virtual machine is terminated in response to a user interrupt, such as typing ^C, or a system-wide event, such as user logoff or system shutdown.

这两句话已经说明了情况了,我觉得非常明确了。

其实我上面说的关机,是按住电源键不放,基本上跟停电一样。。。
3 楼 chenhua_1984 2010-06-04  
beneo 写道
难道你希望停电或者死机的时候,还能执行钩子里面的代码么?

停电肯定是不可能执行的了,关机这个我还没测试过的!呵呵,感觉这个东西并非到处都适用!

至于正常关机这种情况我今天测试一下看看!
2 楼 beneo 2010-06-04  
难道你希望停电或者死机的时候,还能执行钩子里面的代码么?
1 楼 zuoge85 2010-06-04  
嗯,很多时候都执行不到,但是那些情况可以不考虑,这个里面不应该执行关键性操作,但是还是有用

相关推荐

    JAVA虚拟机关闭钩子(Shutdown Hook).docx

    JAVA虚拟机关闭钩子(Shutdown Hook).docx

    blog:日常工作中使用的技术沉淀+学习记录

    介绍 此项目是利用业余时间,对一些技术知识点进行整理,用来记录个人学习笔记。这个项目和 项目的不同在于 是用来动手实践,对于一些技术的实际搭建和造轮子的项目,正...Java虚拟机关闭钩子(Shutdown hook) 公众号

    通过JDK源码分析关闭钩子详解

    Java虚拟机(JVM)在接收到退出指令时,会尝试执行所有注册的关闭钩子,这些钩子通常是实现`Runnable`接口的线程对象。 **关闭钩子的生成步骤**: 1. 创建一个继承自`Thread`的子类。 2. 在子类中实现`run`方法,...

    Java对象的生命周期[参照].pdf

    在这个过程中,理解JVM(Java虚拟机)的角色至关重要,因为它是对象生命周期的主要管理者。 首先,让我们了解一下JVM的结构。JVM是Java虚拟机的缩写,它的主要任务是执行符合Java字节码规范的.class文件。JRE(Java...

    java-编写跨平台Java程序注意事项

    - 当需要终止Java虚拟机(JVM)时,应使用`java.lang.System.exit(int status)`方法。这不仅能正确关闭JVM,还能确保资源被释放。 - 注意不要在多线程环境中随意调用`System.exit()`,因为这可能会导致某些线程没有...

    Runtime 源码分析

    - `freeMemory()`: 返回当前Java虚拟机中的可用内存。 - `totalMemory()`: 返回Java虚拟机总内存。 - `maxMemory()`: 返回Java虚拟机可以使用的最大内存。 3. **系统退出**: - `exit(int status)`: 强制终止...

    Java Runtime类详解_动力节点Java学院整理

    1. `totalMemory()`: 这个方法返回Java虚拟机当前分配的总的内存大小。这包括堆内存以及JVM用于自身操作的内存。 2. `freeMemory()`: 它返回当前可用的内存量,即当前未被对象占用的堆内存大小。 3. `gc()`: 这是...

    Java面试宝典

    Java面试宝典是一份集合了2013年及以前的Java面试重点和常见问题的资源,对于准备Java程序员的面试具有很高的参考价值。这份资料不仅涵盖了基础题,还包含了不同企业的面试题目,旨在帮助求职者全面了解和掌握Java...

    Java利用WatchService监听文件变化示例

    最后,为了确保在Java虚拟机关闭的时候能够释放资源并关闭WatchService,应该在程序中增加一个关闭钩子(shutdown hook),确保在JVM关闭的时候能够执行资源释放的相关操作,特别是关闭WatchService。 下面是一个...

    09 Runtime

    `exit(int status)`方法用于终止当前正在运行的Java虚拟机(JVM)。这是一个非常强大的方法,因为它可以直接导致程序立即停止运行,并返回给操作系统指定的状态码。 ##### 方法细节: 1. **安全性检查**:首先进行...

    kill命令在Java应用中使用的注意事项小结

    2. **信号的选择**:`kill -3`发送SIGNAL 3(SIGQUIT),这会触发Java虚拟机打印当前的线程堆栈信息,这对于调试很有帮助。而`kill -9`则是强制结束进程,不会执行任何清理操作。 3. **后台运行应用**:使用`nohup`...

    Java中后台线程实例解析

    例如,Java虚拟机(JVM)中的垃圾回收线程就是一个典型的后台线程,它负责内存的自动清理工作,不直接影响程序的执行流程。 创建后台线程的条件有以下两点: 1. 必须在启动线程之前通过调用`setDaemon(true)`方法...

    【面试】java程序员面试经常被问的问题(答案).docx

    - **垃圾回收前的钩子:** 当Java虚拟机(JVM)准备回收一个对象时,如果该对象实现了 `Object` 类中的 `finalize()` 方法,那么这个方法将在对象被销毁之前被调用一次。 - **资源释放:** `finalize()` 方法主要...

    shutdown-app

    - 在Java中,`System.exit(int status)`方法用于终止当前正在运行的Java虚拟机(JVM)。这是最直接的关闭应用的方式,但并不推荐在复杂的服务器环境或需要资源清理的情况下使用,因为它不提供任何清理机会。 3. **...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....

    gradle-vagrant-plugin:用于管理流浪者盒子的Gradle插件

    - **停止**:`vagrantHalt`任务安全地关闭Vagrant虚拟机。 - **销毁**:`vagrantDestroy`任务彻底销毁Vagrant虚拟机及其所有数据。 - **配置**:可以自定义Vagrant命令和参数。 - **同步**:支持与Vagrant的同步目录...

    解析Runtime中shutdown hook的使用详解

    在Java编程中,`Runtime`类的`shutdownHook`是一个重要的特性,它允许开发者在Java虚拟机(JVM)即将关闭时执行清理任务。本文将深入解析`shutdown hook`的使用,以及它在不同场景下的应用。 首先,`shutdown hook`...

    Android性能调优利器StrictMode应用分析

    严格模式包含两个主要策略:ThreadPolicy(线程策略)和VmPolicy(虚拟机策略)。 1. **ThreadPolicy**: - 耗时调用检测:通过`detectCustomSlowCalls()`可以检测自定义的长时间运行的方法。 - 磁盘读取检测:`...

Global site tag (gtag.js) - Google Analytics