`

Java应用中使用ShutdownHook友好地清理现场(转帖)

阅读更多

转帖地址:http://www.cnblogs.com/nexiyi/p/java_add_ShutdownHook.html

在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。Java中得ShutdownHook提供了比较好的方案。
  JDK在1.3之后提供了Java Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在以下几种场景被调用:

  • 1)程序正常退出
  • 2)使用System.exit()
  • 3)终端使用Ctrl+C触发的中断
  • 4)系统关闭
  • 5)使用Kill pid命令干掉进程

注:在使用kill -9 pid是不会JVM注册的钩子不会被调用。
在JDK中方法的声明:
public void addShutdownHook(Thread hook)
参数
hook -- 一个初始化但尚未启动的线程对象,注册到JVM钩子的运行代码。
异常
IllegalArgumentException -- 如果指定的钩已被注册,或如果它可以判定钩已经运行或已被运行
IllegalStateException -- 如果虚拟机已经是在关闭的过程中
SecurityException -- 如果存在安全管理器并且它拒绝的RuntimePermission(“shutdownHooks”)

代码示例:
使用Timer模拟一个工作线程,该线程重复工作十次,使用System.exit()退出,在清理现场代码CleanWorkThread 中,取消timer运行,并输出必要的日志信息。

复制代码
package com.netease.test.java.lang;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Date: 14-6-18
 * Time: 11:01
 * 测试ShutdownHook
 */
public class TestShutdownHook {

    //简单模拟干活的
    static Timer timer = new Timer("job-timer");

    //计数干活次数
    static AtomicInteger count = new AtomicInteger(0);

    /**
     * hook线程
     */
    static class CleanWorkThread extends Thread{
        @Override
        public void run() {
            System.out.println("clean some work.");
            timer.cancel();
            try {
                Thread.sleep(2 * 1000);//sleep 2s
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        //将hook线程添加到运行时环境中去
        Runtime.getRuntime().addShutdownHook(new CleanWorkThread());
        System.out.println("main class start ..... ");
        //简单模拟
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                count.getAndIncrement();
                System.out.println("doing job " + count);
                if (count.get() == 10) {  //干了10次退出
                    System.exit(0);
                }
            }
        }, 0, 2 * 1000);

    }
}
复制代码

 



运行后,可以模拟以上五种场景进行测试,只有kill -9 pid不会执行Hook里面的代码。

分享到:
评论

相关推荐

    转帖经典---JAVA设计模式

    《转帖经典---JAVA设计模式》这本书或资料可能涵盖了这些模式的详细解释、示例代码以及如何在实际项目中应用这些模式。通过学习和理解这些设计模式,开发者能够更好地设计和重构软件,提升代码质量。

    论坛转帖工具.rar

    标题中的“论坛转帖工具.rar”表明这是一个用于在论坛之间转移帖子的软件工具,通常用于帮助用户方便地将一个论坛的帖子内容复制到另一个论坛,可能是为了分享信息、讨论或保存重要的帖子。这类工具可能包括自动抓取...

    编辑人员转帖去水印工具

    总之,编辑人员转帖去水印工具如Teorex Inpaint,为图像编辑提供了便利,通过其独特的算法和技术,我们可以高效地去除图片中的水印,提高内容的质量。但在使用过程中,务必遵守版权法和相关法律法规,以维护良好的...

    贴吧转帖工具

    【贴吧转帖工具】是一种专为百度贴吧用户设计的便捷工具,主要用于提高用户在贴吧中的互动效率。通过这款工具,用户可以实现一键转帖和一键8经验签到的功能,极大地简化了传统操作流程,节省了用户的时间,提升了...

    【转帖】 使用 JProfiler 监控 JBoss 运行情况

    JProfiler是一款功能强大的Java性能分析工具,它可以对Java应用程序、Applets、Java Web Start应用以及应用服务器进行性能监控与分析。通过深入地分析内存使用、线程活动、垃圾回收等关键性能指标,帮助开发人员及...

    转帖:Android应用的自动升级、更新模块的实现docx.docx

    在Android应用开发中,自动升级和更新功能是一个重要的特性,它允许用户无缝地获取应用的最新版本,提高用户体验。本文将详细介绍如何实现这样一个模块。 **一、基础概念** 1. **版本标识**: 在AndroidManifest.xml...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    【转帖】Flex 开发入门

    8. **移动开发**: Flex 也支持移动应用开发,通过Adobe AIR(Adobe Integrated Runtime),开发者可以使用相同的Flex技术创建跨平台的桌面和移动应用,覆盖iOS、Android和BlackBerry等平台。 9. **Flex 和响应式...

    discuz X2转帖工具、采集工具

    1. 社区营销:对于企业或个人来说,使用转帖工具可以帮助推广产品或服务,提升品牌知名度。 2. 信息聚合:对于新闻资讯类论坛,可以通过采集功能快速收集并分享最新信息,提升论坛的新闻价值。 3. 数据分析:通过...

    【CBM666 搜集的Windows消息大全(转帖)】

    《Windows消息大全——CBM666搜集整理》 Windows操作系统是基于事件驱动的,而事件的核心就是...通过学习和掌握这些消息,我们可以更好地控制应用程序的行为,提高用户体验,打造出更加高效、稳定的Windows应用程序。

    一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0.rar

    本文将深入探讨“一键转帖功能插件”在帝国CMS 6.0系统中的应用与实现,该插件适用于GBK及UTF-8编码环境,旨在提升网站内容的分享与传播效率。我们将从安装步骤、工作原理、可能遇到的问题以及解决方案等方面进行...

    原创: httpclient 4.0 使用 - 访问开心网的各种组件 例子

    HttpClient 是 Apache 开源基金会提供的一个 HTTP 客户端库,被广泛应用于 Java 开发中,用于执行 HTTP 请求。HttpClient 4.0 版本引入了许多改进和新特性,使得它更加稳定、高效且易于使用。本文将详细讲解如何使用...

    Think恢复系统使用详解,只备份系统盘就行了。功能极其强悍《转帖》

    如果需要清理磁盘空间,可以通过恢复软件来安全地删除备份文件。 总的来说,Think恢复系统提供了一个高效且用户友好的解决方案,帮助用户在面对系统问题时能迅速恢复,同时避免了全盘恢复可能导致的数据丢失。对于...

    转帖工具插件 for PHPwind 7.5 正式版.rar

    总的来说,"转帖工具插件 for PHPwind 7.5 正式版" 提供了一个高效且用户友好的解决方案,帮助管理者优化论坛内容的组织和管理,同时降低了操作复杂度,提升了用户体验。正确理解和使用这款插件,能有效提升 PHPwind...

    [转帖]通过WebView获取访问网页的源代码

    在Android应用开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容。有时,我们可能需要获取用户通过WebView浏览的网页源代码,以便进行进一步的数据分析或者实现特定功能。这篇博客...

    Html2UBBMaxcj_Softii论坛专用转帖工具

    HTML2UBBMaxcj 是一款专为Softii论坛设计的转帖工具,它主要用于将HTML格式的帖子内容转换成UBB代码,以便在论坛中更好地显示和分享。UBB(Universal BBCode)是一种轻量级的标记语言,常用于网络论坛,与HTML类似,...

    转帖性能测试.pdf

    负载测试是一个分析软件应用程序和支撑架构、模拟真实环境的使用,从而来确定能够接收的性能过程。 压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。压力测试可以...

    asphtml学习

    6. **Java中文处理**:`交流论坛--漫谈Java中的中文问题[转帖].htm`可能探讨了在Java环境中处理中文字符集的问题,这对于多语言网站开发来说至关重要。 7. **Servlet与JSP教程**:`交流论坛--Java Servlet和JSP教程...

    一键转帖功能插件 for 帝国CMS v1.0.rar

    "一键转帖功能插件 for 帝国CMS v1.0.rar" 是一个专为帝国CMS设计的扩展工具,其主要目标是简化用户在网站上分享内容的过程,提高用户体验。这个插件允许用户轻松地将网站上的文章或信息复制并转发到其他平台,如...

Global site tag (gtag.js) - Google Analytics