利用 java.lang.Runtime.addShutdownHook() 钩子程序,保证java程序安全退出
来源:互联网 发布:电话轰炸机软件免费版 编辑:程序博客网 时间:2024/06/18 13:43
以前在开发时只知道依靠数据库事务来保证程序关闭时数据的完整性。
但有些时候一个业务上要求的原子操作,不一定只包括数据库,比如外部接口或者消息队列。此时数据库事务就无能为力了。
这时我们可以依靠java提供的一个工具方法:java.lang.Runtime.addShutdownHook(Thread hook)
addShutdownHook方法可以加入一个钩子,在程序退出时触发该钩子。
(退出是指ctrl+c或者kill -15,但如果用kill -9 那是没办法的,具体有关kill的signal机制有篇大牛的文章《Linux 信号signal处理机制》)
钩子做什么操作都可以,甚至可以循环检查某个线程的状态,直到业务线程正常退出,再结束钩子程序就可以保证业务线程的完整性
例子程序如下:
实例程序在执行过程中按下ctrl -c或者 kill -15,由于钩子程序的循环检测,能够保证线程执行完毕后,程序才关闭。
1 /** 2 * Created by IntelliJ IDEA. 3 * User: Luo 4 * Date: 13-7-11 5 * Time: 下午3:12 6 */ 7 8 public class TestShutdownHook { 9 10 /**11 * 测试线程,用于模拟一个原子操作12 */13 private static class TaskThread extends Thread {14 @Override15 public void run() {16 System.out.println("thread begin ...");17 TestShutdownHook.sleep(1000);18 System.out.println("task 1 ok ...");19 TestShutdownHook.sleep(1000);20 System.out.println("task 2 ok ...");21 TestShutdownHook.sleep(1000);22 System.out.println("task 3 ok ...");23 TestShutdownHook.sleep(1000);24 System.out.println("task 4 ok ...");25 TestShutdownHook.sleep(1000);26 System.out.println("task 5 ok ...");27 28 System.out.println("thread end\n\n");29 }30 }31 32 /**33 * 注册hook程序,保证线程能够完整执行34 * @param checkThread35 */36 private static void addShutdownHook(final Thread checkThread) {37 //为了保证TaskThread不在中途退出,添加ShutdownHook38 Runtime.getRuntime().addShutdownHook(new Thread() {39 public void run() {40 System.out.println("收到关闭信号,hook起动,开始检测线程状态 ...");41 //不断检测一次执行状态,如果线程一直没有执行完毕,超时后,放弃等待 \42 for (int i = 0; i < 100; i++) {43 if (checkThread.getState() == State.TERMINATED) {44 System.out.println("检测到线程执行完毕,退出hook");45 return;46 }47 TestShutdownHook.sleep(100);48 }49 System.out.println("检测超时,放弃等待,退出hook,此时线程会被强制关闭");50 }51 });52 }53 54 55 private static void sleep(long millis) {56 try {57 Thread.sleep(millis);58 } catch (InterruptedException e) {59 e.printStackTrace();60 }61 }62 63 public static void main(String[] args) throws InterruptedException {64 final TaskThread taskThread = new TaskThread();65 //为了保证TaskThread不在中途退出,添加ShutdownHook66 addShutdownHook(taskThread);67 //执行TaskThread68 taskThread.start();69 }70 71 }
http://www.cnblogs.com/baibaluo/p/3185925.html
阅读全文
0 0
- 利用 java.lang.Runtime.addShutdownHook() 钩子程序,保证java程序安全退出
- java中addShutdownHook钩子程序用途
- JAVA程序退出时执行的操作Runtime类的addShutdownHook函数使用示例
- JAVA程序退出时执行的操作Runtime类的addShutdownHook函数使用示例
- JAVA程序退出时执行的操作Runtime类的addShutdownHook函数使用示例
- JAVA程序退出时执行的操作Runtime类的addShutdownHook函数使用示例
- java中的“钩子”--addShutdownHook
- JAVA Runtime.addShutdownHook()方法
- JAVA Runtime.addShutdownHook()方法
- java退出执行addShutdownHook
- Runtime.addShutdownHook添加钩子
- JAVA Runtime.addShutdownHook()方法{拿到线程句柄,在程序关闭之前调用释放资源}
- RunTime.getRunTime().addShutdownHook 添加钩子
- java虚拟机钩子关闭函数addShutdownHook
- java.util.Runtime类中的addShutdownHook()方法
- Java中Runtime.getRuntime().addShutdownHook()方法
- 【java.lang】〖Runtime〗如何正确地应用Runtime类调用程序
- Runtime.getRuntime().addShutdownHook关闭钩子介绍
- JSON
- C语言基础 原码 反码 补码 移码简介
- MySQL安装配置,命令,异常纪要
- ListView简单实用-表头表尾分割线的设置
- 虚拟机关于centos的root密码破解
- 利用 java.lang.Runtime.addShutdownHook() 钩子程序,保证java程序安全退出
- 1066. 图像过滤(15)
- Navicat连接不上Linux服务器上的MySQL。
- 横拉列表
- 统计学习方法笔记:1.2 线性支持向量机与软间隔最大化
- LeetCode-561. Array Partition I
- neural_style的使用-人人都是艺术家
- C# web 分页控件
- 最小生成树记路径