Dev@Free

          zJun's Tech Weblog

          為程序加上“關閉鉤子”(ShutdownHook)

          關閉鉤子”(ShutdownHook)是這樣一個概念:向虛擬機注冊一個線程,當程序退出(Ctrl+C)時虛擬機會啟動這個線程,我們可以在這個線程的run()中做一些清除的工作,如:釋放數據庫連接,關閉文件等.

          注冊:

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

          注銷:

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

          [例子]
          /**
           * 在這個線程中實現程序退出前的清理工作
           * 
           * @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線程,執行了定義的釋放工作。

          posted on 2006-03-12 23:38 zJun's帛羅閣 閱讀(3743) 評論(5)  編輯  收藏

          評論

          # re: 為程序加上“關閉鉤子”(ShutdownHook) 2006-03-13 09:09 anyfly

          你這個程序通得過???不會是死循環???樓主的知識點不錯,但程序一看就知道有問題了,樓主真得測試過?  回復  更多評論   

          # re: 為程序加上“關閉鉤子”(ShutdownHook) 2006-03-13 09:43 kavin

          @anyfly
          你先在你的機器上試試,看看會不會出現你說的問題?! 呵呵
            回復  更多評論   

          # re: 為程序加上“關閉鉤子”(ShutdownHook) 2006-03-13 11:32 zJun

          @anyfly
          使用Ctrl+C退出試試看。
          忘了說明一下,shutdownhook通常用來在Ctrl+C退出時觸發清理工作(多是在后臺服務中,這種服務通常是24*7運行的,正常情況下是不退出的),如果能夠在程序中顯式地確定退出的時機,那么最好是直接在退出前做清理,不用搞得這么復雜。  回復  更多評論   

          # re: 為程序加上“關閉鉤子”(ShutdownHook) 2006-03-13 14:38 wfeng007

          樓主的注釋寫錯了。。。 被注冊到shutdownhook上的是TestShutdownHook的實例作清理工作的也是TestShutdownHook的run() 他將無限循環的TestThread.run()中止了。  回復  更多評論   

          # re: 為程序加上“關閉鉤子”(ShutdownHook) 2006-03-13 18:43 zJun

          @wfeng007
          是的,謝謝指正。已更正。  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          <2006年3月>
          2627281234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統計

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          博客

          文檔

          站點

          論壇

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 林甸县| 咸宁市| 兰州市| 平顺县| 永顺县| 正蓝旗| 延长县| 南溪县| 宜兰市| 塔城市| 二连浩特市| 上犹县| 东乌珠穆沁旗| 肇东市| 朝阳县| 北流市| 西峡县| 龙井市| 静安区| 天水市| 阳西县| 朝阳市| 乡城县| 且末县| 宜章县| 叙永县| 垣曲县| 新泰市| 玛沁县| 泰兴市| 道孚县| 揭阳市| 丹寨县| 旅游| 闸北区| 伊宁市| 察哈| 拉孜县| 固原市| 察雅县| 鄂州市|