Dev@Free

          zJun's Tech Weblog

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

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

          注冊:

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

          注銷:

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

          [例子]
          /**
           * 在這個線程中實現(xiàn)程序退出前的清理工作
           * 
           * @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;
              }

              
          /**
               * 實現(xiàn)程序退出前的清理工作
               
          */

              
          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);
              }
          }

          運行結(jié)果:

          run sub thread
          run sub thread
          run sub thread
          run sub thread
          This is ShutdownHook
          stop sun sub thread

          可以看到:當程序退出時啟動了TestThread線程,執(zhí)行了定義的釋放工作。

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

          評論

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

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

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

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

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

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

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

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

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

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


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


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

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

          統(tǒng)計

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          博客

          文檔

          站點

          論壇

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 突泉县| 玛沁县| 五河县| 宜兰市| 喜德县| 惠安县| 大港区| 安乡县| 宁陕县| 赤城县| 东明县| 宣城市| 天峨县| 图木舒克市| 南溪县| 镇巴县| 梁河县| 从江县| 湘乡市| 安仁县| 交城县| 和田县| 台山市| 林口县| 祁连县| 大邑县| 奉贤区| 察哈| 苏州市| 盈江县| 普兰店市| 剑阁县| 太原市| 梅州市| 冀州市| 东明县| 龙南县| 荥阳市| 闸北区| 商都县| 利辛县|