2012-11-06 59 views
1

我有一個保存密碼的文本文件的密碼保存程序。用戶可以添加或刪除密碼,數據將被重新寫入文本文件。爲防止程序變得非常慢,每次程序需要保存時,我都會創建一個新線程。我有一個擴展Thread的類,並將所有數據寫入指定的文本文件。我遇到的問題是在用戶想要退出之前嘗試保存所有數據。當按下退出按鈕時,我創建一個新線程來保存數據,然後調用System.exit()函數來退出。完成所有線程後退出Java程序

Thread t = new SaveThread(); 
t.start(); 
System.exit(0); 

我注意到程序將在線程完成之前退出。有什麼辦法可以告訴java只有當我的線程停止運行時才退出?

+2

您可以在退出課程之前調用't.join()'。 – Gray

+0

不會爲您的線程設置「守護進程」標誌,並且JVM將等待所有後臺線程的完成。 – jdevelop

+0

爲什麼它很慢保存文本文件?這是我想到的第一個問題 –

回答

1

你有三個選擇:

  1. 呼叫t.join()後啓動線程
  2. 使用t.run()代替t.start()
  3. 通過Runtime.addShutdownHook添加您的保存線程作爲關機掛鉤。

選項1

這一個是容易的:

Thread t = new SaveThread(); 
t.start(); 
t.join(); 
System.exit(0); 

選項2

也容易:

Thread t = new SaveThread(); 
t.run(); 
System.exit(0); 

選項3

也很容易,但在您的應用程序啓動時完成。在您的應用程序初始化代碼中,執行以下操作:

Runtime.getRuntime().addShutdownHook(new SaveThread()); 

而且它會在應用程序關閉時自動運行。

1

您可以使用Runtime.addShutdownHook()來註冊應該在JVM關閉之前運行的代碼。

OR

您可以使用Thread.join()等待線程。

1

您有幾種選擇:

  1. 在致電System.exit(),呼籲每個線程thread.join()
  2. 而不是調用System.exit(),讓您的主線程從其main()函數返回。這將等待所有非守護線程在進程關閉之前終止。
+0

問題解決了! –

0

如果SaveThread是最後一個要執行的操作,爲什麼不將System.exit()調用移入該線程?


有更好的解決方案,同意了,但如果你想用這種方法,並使用該保存情況線程多次,那麼你可以很容易地將其參數化:

public SaveThread extends Thread { 

    private exitAfterSave = false; 

    public SaveThread() { 
    this(false); 
    } 

    public SaveThread(boolean exitAfterSave) { 
    this.exitAfterSave = exitAfterSave; 
    } 

    @Overwrite 
    public void run() { 

     // Save what has to be saved 

     if (exitAfterSave) { 
     System.exit(0); 
     } 
    } 
} 
+0

,因爲當我不希望程序退出時,在整個程序中多次調用保存線程。 –