文章出處

最近一直在做測試方面的事情,被測的一些功能需要連接到FTP服務器上。而我在做本地測試時為了方便,就使用java寫了一個簡單的ftp服務器,可以在命令行下直接啟動運行。

當時在main函數里是這樣寫的。

1
2
3
4
5
6
7
public class App {

    public static void main(String[] args) {
        FtpServer ftpServer = new FtpServer();
        ftpServer.start();
    }
}

然后在命令行運行java -jar ftpserver.jar就可以啟動這個FTP服務。一切都很完美。當我想關閉FTP服務時,直接按了Ctrl + C來終止了這個JVM實例。但是我發現ftpserver.jar這個文件刪不了了,原因是雖然我終止了該JVM實例,但是FTP服務器并沒有被正確的退出。

那么如何實現在按Ctrl+C終止該JVM實例時,能夠讓程序調用FtpServer中的stop方法來關閉FTP服務?我想在Google上尋找答案,但是連續換了幾個關鍵詞都沒找到解決方案。

這個時候我都有點差點放棄了,心想反正也不是一個很嚴重的問題。后來想到不如在StackOverFlow上問一下吧。說實話雖然我經常上StackOverFlow,但是很少在上面問問題。

我在StackOverFlow上發布了這個問題,鏈接如下。 http://stackoverflow.com/questions/21108059/stop-the-process-when-press-command-c-in-terminal

過了不到20分鐘,就收到了一個回答。

從上面可以看出,其實我這個問題之前已經有人問過了,并且收到了滿意的答案。我根據回答中提供的鏈接,很快實現了方法。

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
        final FtpServer ftpServer = new FtpServer();

        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                ftpServer.stop();
            }
        });

        ftpServer.start();
    }

在oracle的官方文檔中有對addShutdownHook方法的詳細解釋。

通過文檔可以看出JVM在兩種事件下會響應shutdown:

  1. 程序正常退出,比如最后的非后臺線程退出或System.exit方法被調用。

  2. 用戶終止了JVM,比如按下Ctrl+C,或者登出或關閉系統。

某些情況下JVM是不會響應shutdown的,比如直接用kill命令殺死進程。JVM在shutdown時,會自動觸發注冊的hook線程,并以并行的方式來運行,JVM并不保證這些hook的調用順序。

通過這個小事件給了我兩個啟示:

  1. 當碰到技術困難時,不要輕言放棄,努力找出解決方案。即使找不到完美的解決方案,也要想一些替代方案。

  2. 在StackOverFlow上問問題時不要太著急,先查找下有沒有類似的已經解決的問題,這樣可以節省時間。


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()