通過
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 }