天天看點

記一次在StackOverFlow上問問題的經曆

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

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

然後在指令行運作<code>java -jar ftpserver.jar</code>就可以啟動這個FTP服務。一切都很完美。當我想關閉FTP服務時,直接按了<code>Ctrl</code> + <code>C</code>來終止了這個JVM執行個體。但是我發現ftpserver.jar這個檔案删不了了,原因是雖然我終止了該JVM執行個體,但是FTP伺服器并沒有被正确的退出。

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

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

我在StackOverFlow上釋出了這個問題,連結如下。

<a href="http://stackoverflow.com/questions/21108059/stop-the-process-when-press-command-c-in-terminal">http://stackoverflow.com/questions/21108059/stop-the-process-when-press-command-c-in-terminal</a>

記一次在StackOverFlow上問問題的經曆

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

記一次在StackOverFlow上問問題的經曆

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

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

程式正常退出,比如最後的非背景線程退出或System.exit方法被調用。

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

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

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

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

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