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


最近一直在做測試方面的事情,被測的一些功能需要連接到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上問問題時不要太着急,先查找下有沒有類似的已經解決的問題,這樣可以節省時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM