通过
Runtime.getRuntime().
addShutdownHook(
Thread hook)
方法可以给当前的进程注册一个清理线程,当进程退出的时候,会执行线程中的代码。
1、为了统一清理线程的实现,可以做一个Destroyable接口,实现此接口的类都有一个destroy()方法,里面包含了该类的清理过程,例如关闭数据库连接、关闭Socket连接等。
Destroyable接口的代码:
1 package net.blogjava.amplifier;
2
3 /**
4 * 建立此接口的目的是为了实现程序退出时的清理
5 * 在Java控制台程序中,用户可以通过关闭命令行窗口或按下Ctrl+C来结束程序的运行
6 * 这时候应该保证资源能够被正确释放,例如数据库的连接、Socket的连接应该关闭
7 * 实现了本接口的类的实例引用可以由一个ShutdownHook线程来操作
8 * 此线程在虚拟机退出时执行,详见Runtime.addShutdownHook()方法
9 * @author amplifier
10 *
11 */
12 public interface Destroyable {
13 /**
14 * 实现本接口的类需要实现此方法,方法中包含该类的清理代码,
15 * 例如关闭数据库连接、关闭Socket连接等
16 *
17 */
18 void destroy();
19 }
2、建立一个继承于Thread的类ShutdownHook,里面的一个域是Destroyable实现类的引用,在该类的构造函数中可以传入该Destroyable实现类。
ShutdownHook的代码:
1 package net.blogjava.amplifier;
2
3 public class ShutdownHook extends Thread {
4
5 private Destroyable desObj;
6
7 public ShutdownHook(Destroyable desObj){
8 this.desObj = desObj;
9 }
10
11 @Override
12 public void run() {
13 if(this.desObj!=null){
14 try{
15 this.desObj.destroy();
16 }
17 catch (Exception e) {
18 }
19 }
20 }
21
22 /** *//**
23 * @param args
24 */
25 public static void main(String[] args) {
26
27
28 }
29
30 }
3、在main()方法中注册ShutdownHook。
1 public static void main(String[] args){
2 DestroyableImpl di = new DestroyableImpl();
3 ShutdownHook sh = new ShutdownHook(di);
4 Runtime.getRuntime().addShutdownHook(sh);
5 Runtime.getRuntime().addShutdownHook(new Thread(){
6 public void run(){
7 System.out.println("正在退出……");
8 }
9 });
10 di.otherMethod();
11 }