2016-07-23 45 views
2

我爲使用swing的桌面開發了一個高級java應用程序(Financial Management),並且我有一些正在使用它的客戶端。最近我的一個客戶說,有時候應用程序會凍結,當他做了很多工作時,他不得不重新啓動它。

問題是,當我在我的機器上測試應用程序時工作正常,即使我用一些操作和數據超載它也不凍結!

任何人都可以給我一些關於什麼是可能的東西,可以使搖擺Java應用程序做這樣的事情,我怎樣才能提高我的應用程序的性能提示。改進java應用程序

+0

也許這可以幫助你:[課:併發Swing](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/) – pzaenger

+0

謝謝我會看看它:) – SlimenTN

回答

3

它可能有很多原因。我的第一個猜測是你的代碼中的某個地方會出現race condition。一個有趣的事實是,如果應用程序使用0%的CPU時間或100%的CPU時間,而它看起來是凍結的。 0%表示有些事情正在彼此等待(死鎖)。 100%表示無限循環。 如果您可以訪問客戶端的機器,您可以將調試器連接到凍結的應用程序,或使用jstack創建堆棧跟蹤轉儲。

foo.addActionListener((ActionEvent ae) -> { 
    // time consuming task 
}); 

這將導致所有的用戶界面部分凍結,直到函數:

+0

不錯的提示謝謝你特別是「jstack」我需要這樣的東西: ) – SlimenTN

0

一種可能性執行一個ActionListener內的大型任務運行大型任務的Swing線程,而不是另一個線程內,例如回報。確保諸如此類的函數將實際工作傳遞給新線程或設置標誌以在現有線程中執行工作。

例如在Main的靜態布爾這是在主迴路檢查:

public static class Main { 
    public static boolean do_action; 
    public static void main(){ 
     while(true) { 
      if(do_action) { 
       // do action of some kind 
       do_action = false; 
      } 
      // sleep or do other things 
     } 
    } 
} 

和動作監聽器,如下:

foo.addActionListener((ActionEvent ae) -> { 
    Main.do_action = true; 
}); 
+0

嗯,你可以給我舉個例子我可以設置標誌嗎? – SlimenTN

+0

是的,你是對的,我有一些actionListeners內的大任務。 – SlimenTN

+0

我用一個例子更新了它。一個標誌只會是你在主循環中檢查的靜態布爾值。希望這有助於:) – Drgabble

相關問題