ShutdownHook 是这样一个概念:向虚拟机注册一个线程,当程序退出(Ctrl+C)时虚拟机会启动这个线程,我们可以在这个线程的run()中做一些清除的工作,如:释放数据库连接,关闭文件等.

注册:

Runtime.getRuntime().addShutdownHook(Thread t); 

注销:

Runtime.getRuntime().removeShutdownHook(Thread t);

请注意, 该 hook 线程必须是已经初始化但是没有运行的线程, 这个线程将在虚拟机响应用户的中断之前运行, 例如按下 ^C, 或者系统范围的事件, 例如注销或者关闭系统时.

[例子]

/**
 * 在这个线程中实现程序退出前的清理工作
 * 
 * @author Administrator
 * 
 */
class TestThread extends Thread {
    boolean isTerminal = false;

    public void run() {
        while (!isTerminal) {
               try {
                  Thread.sleep(1000);
               } catch (InterruptedException e) {
                  e.printStackTrace();
               }
            System.out.println("run sub thread");
        }
    }

    /**
     * 清理工作
     */
    public void onTerminal() {
        isTerminal = true;
        System.out.println("stop sun sub thread");
    }
}
/**
 * ShutdownDownHook测试类
 * 
 * @author Administrator
 * 
 */
public class TestShutdownHook extends Thread {
    TestThread testThread;

    public void addThread(TestThread t) {
        testThread = t;
    }

    /**
     * 实现程序退出前的清理工作
     */
    public void run() {
        System.out.println("This is ShutdownHook");
        testThread.onTerminal();
    }

    public static void main(String[] args) {
        TestShutdownHook m = new TestShutdownHook();
        TestThread t = new TestThread();
        t.start();
        m.addThread(t);
        // 注册退出处理线程
        Runtime.getRuntime().addShutdownHook(m);
    }
}

运行结果:

run sub thread
run sub thread
run sub thread
run sub thread
This is ShutdownHook
stop sun sub thread

可以看到:当程序退出时启动了TestThread线程,执行了定义的释放工作。

转载于:https://www.cnblogs.com/zjun/archive/2011/09/29/2195927.html

为Java应用程序加上退出事件处理(ShutdownHook)相关推荐

  1. java关闭事件_为Java程序添加退出事件

    package org.swing.os; import java.util.*; import java.io.*; /** * 为Java程序添加退出事件 * * @author wuhq */ ...

  2. java自动加空格吗_程序加上空格和不加空格运行结果不一样

    已结贴√ 问题点数:20 回复次数:2 程序加上空格和不加空格运行结果不一样 程序第六行在教育教学后面加空格结果为 全部图书: 1.郁达夫随笔:伤感行旅    郁达夫    北京大学出版社    38 ...

  3. Java应用程序的基本框架

    为什么80%的码农都做不了架构师?>>>    1Java应用程序的运行环境 Java应用程序是指可以独立运行在Java虚拟机上的程序,它是一种中间代码(byte-code?copy ...

  4. 【Java应用程序开发】【期末复习题】【2022秋】【答案仅供参考】

    文章目录 零.考试说明 一.单选题(175-2-2题,1') 二.多选题(16题,2') 三.判断题(20题,1') 四.简答题(18题,5') 五.编程题(9题,10') 零.考试说明 答题时长:9 ...

  5. JAVA图形界面中的事件处理

    在JAVA应用程序或者Applet运行时,如果用户进行某个操作,例如单机鼠标键或者输入字符,程序应当做出适当响应. 那举个例子来说,当我们点击某个按钮,会出现一个按钮事件,那么这个就是按钮的事件处理: ...

  6. Java GUI程序示例

    Java GUI程序示例 与命令行界面相比,图形界面对于用户来说更为简便易用.图形用户界面(Graphical User Interface,简称 GUI),关于Java图形用户界面,可参见 http ...

  7. Java小程序之记事本

    这个记事本只做了个界面,里面的功能就做了三四个吧!特别适合新手学做GUI这一章. 我主要分了两大类,代码注释上面都有. 第一大类我主要把用到的所有组件全部定义了出来,这样看起来更方便一点 第二大类就是 ...

  8. java进程未正常退出

    2019独角兽企业重金招聘Python工程师标准>>> 背景: 通过shell脚本定时启动的java进程一直都没有退出 #0 */2 * * * /shell/command.sh ...

  9. Java应用程序项目的打包与发行

    这里主要是讲解一下怎样将 Java程序打包成独立运行的exe程序包,以下这种方法应该是最佳的解决方案了.NetDuke的EXE程序包了是使用这种方案制作的.在操作步骤上还是比较简单的,而且通用性强. ...

最新文章

  1. ASP绕过防注入的新思路
  2. 这个笑脸胡子的表情是什么:“<:] {%>”?
  3. Ninja Blocks物联网平台简介
  4. hql可以使用distinct吗_香薰精油可以当香水使用吗
  5. C++实现cut rod切杆算法(附完整源码)
  6. HDFS写入和读取过程
  7. GitBook的使用方式,快速创建网页文档
  8. vs2015调试时不显示vector内容的解决方法
  9. 数学建模可以用python吗_Python中常用的数学建模Scipy
  10. POJ 3617 Best Cow Line
  11. 985翻译硕士都在找的这款软件
  12. html5网页及Cocos中生成二维码
  13. 取绝对值 :abs fabs fabsf用法
  14. 国际足联还不考虑在中国办一届世界杯吗?
  15. C语言RLE压缩解压算法(西电C程序作业4)
  16. SCCM部署系统任务序列失败错误代码0x80070002
  17. 第九届泰迪杯A题(1)
  18. python listbox大小_Python3 tkinter基础 Listbox height 显示行数的上限
  19. 投资理财-言微不劝人
  20. ChatGPT国内镜像站初体验:聊天、Python代码生成等

热门文章

  1. mysql 磁盘组_有效管理 ASM 磁盘组空间
  2. c语言课题设计字符串处理函数报告,C语言输入输出库函数设计实验报告.doc
  3. PHP数组的访问方法有几种,数组常用方法有哪些
  4. 体积最小桌面linux,Tiny Core Linux - 体积最小的精简 Linux 操作系统发行版之一 (仅10多MB)...
  5. c语言中二维数组的结构体,怎么才能把结构体里面的二维数组打印出来?
  6. map+DP leetcode446
  7. Redis:21---客户端相关配置篇
  8. (一)容器从入门到深入-容器和镜像
  9. 推荐系统(5)-深度推荐模型-AutoRec、DeepCrossing、NeuralCF、PNN、WideDeep、FNN、DeepFM、NFM
  10. Linux crypto相关知识的汇总 Linux加密框架crypto对称算法和哈希算法加密模式