最近一直在做測試方面的事情,被測的一些功能需要連接到FTP服務器上。而我在做本地測試時為了方便,就使用java寫了一個簡單的ftp服務器,可以在命令行下直接啟動運行。
當時在main函數里是這樣寫的。
1 2 3 4 5 6 7 |
|
然后在命令行運行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 |
|
在oracle的官方文檔中有對addShutdownHook方法的詳細解釋。
通過文檔可以看出JVM在兩種事件下會響應shutdown:
程序正常退出,比如最后的非后臺線程退出或System.exit方法被調用。
用戶終止了JVM,比如按下Ctrl+C,或者登出或關閉系統。
某些情況下JVM是不會響應shutdown的,比如直接用kill命令殺死進程。JVM在shutdown時,會自動觸發注冊的hook線程,并以并行的方式來運行,JVM并不保證這些hook的調用順序。
通過這個小事件給了我兩個啟示:
當碰到技術困難時,不要輕言放棄,努力找出解決方案。即使找不到完美的解決方案,也要想一些替代方案。
在StackOverFlow上問問題時不要太著急,先查找下有沒有類似的已經解決的問題,這樣可以節省時間。
文章列表