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

本文介绍如何在Java程序退出时使用ShutdownHook线程执行清理工作,包括释放数据库连接和关闭文件等操作。

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

注册:

None.gifRuntime.getRuntime().addShutdownHook(Thread t); 

注销:

None.gifRuntime.getRuntime().removeShutdownHook(Thread t);

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

[例子]

ExpandedBlockStart.gif/**
InBlock.gif * 在这个线程中实现程序退出前的清理工作
InBlock.gif * 
InBlock.gif * @author Administrator
InBlock.gif * 
ExpandedBlockEnd.gif 
*/

None.gifclass TestThread extends Thread {
None.gif    boolean isTerminal 
= false;
None.gif
None.gif    
public void run() {
None.gif        
while (!isTerminal) {
None.gif               try {
None.gif                  Thread.sleep(
1000);
None.gif               } catch (InterruptedException e) {
None.gif                  e.printStackTrace();
None.gif               }
None.gif            System.out.println("run sub thread");
None.gif        }
None.gif    }
None.gif
ExpandedBlockStart.gif    
/**
InBlock.gif     * 清理工作
ExpandedBlockEnd.gif     
*/

None.gif    
public void onTerminal() {
None.gif        isTerminal 
= true;
None.gif        System.out.println("stop sun sub thread");
None.gif    }
None.gif}


ExpandedBlockStart.gif/**
InBlock.gif * ShutdownDownHook测试类
InBlock.gif * 
InBlock.gif * @author Administrator
InBlock.gif * 
ExpandedBlockEnd.gif 
*/

None.gif
public class TestShutdownHook extends Thread {
None.gif    TestThread testThread;
None.gif
None.gif    
public void addThread(TestThread t) {
None.gif        testThread 
= t;
None.gif    }
None.gif
ExpandedBlockStart.gif    
/**
InBlock.gif     * 实现程序退出前的清理工作
ExpandedBlockEnd.gif     
*/

None.gif    
public void run() {
None.gif        System.out.println("This 
is ShutdownHook");
None.gif        testThread.onTerminal();
None.gif    }
None.gif
None.gif    
public static void main(String[] args) {
None.gif        TestShutdownHook m 
= new TestShutdownHook();
None.gif        TestThread t 
= new TestThread();
None.gif        t.start();
None.gif        m.addThread(t);
None.gif        
// 注册退出处理线程
None.gif        Runtime.getRuntime().addShutdownHook(m);
None.gif    }
None.gif}

运行结果:

None.gifrun sub thread
None.gifrun sub thread
None.gifrun sub thread
None.gifrun sub thread
None.gifThis is ShutdownHook
None.gifstop sun sub thread

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值