2016-07-23 16 views
2

私は、スイングを使用してデスクトップ用の高度なJavaアプリケーション(Financial Management)を開発しました。私はそれを使用しているクライアントをいくつか持っています。最近私のクライアントの一人は、アプリケーションが凍って何回か作業をしたときにアプリケーションを再起動しなければならないと言っていました。

問題は、私のマシン上のアプリケーションをテストしてうまく動作し、いくつかのアクションとデータでオーバーロードしてもフリーズしないということです!

スイングJavaアプリケーションがそのようなことをする可能性のあることについて、誰かに私にいくつかのヒントを教えてもらえますか、どうすれば自分のアプリケーションのパフォーマンスを向上させることができますか?Javaアプリケーションの改善

+0

はたぶん、これはあなたが役立ちます:[レッスン:で同時実行をスイング] – 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のスレッド内で大規模なタスクを実行している可能性があります戻る。このような関数が実際の作業に新しいスレッドに渡すか、またはフラグを設定して既存のスレッドで作業を実行するようにしてください。例えば

メインループでチェックされているメインの静的ブールあります

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

あなたは私にhの例を教えてくださいこんにちはフラグを設定できますか? – SlimenTN

+0

そして、はい、私はいくつかの大きなタスクをいくつかのactionListenersの中に持っています。 – SlimenTN

+0

例を使って更新しました。フラグは、メインループをチェックインする静的ブール値に過ぎません。これが助けて欲しいと思っています:) – Drgabble