2016-07-23 6 views
2

Ich habe eine erweiterte Java-Anwendung (Financial Management) für Desktop mit Swing entwickelt und ich habe einige Clients, die es verwenden. Kürzlich hat einer meiner Kunden gesagt, dass die Anwendung manchmal einfriert und er neu starten muss, wenn er viel daran arbeitet.

Das Problem ist, wenn ich die Anwendung auf meinem Gerät testen funktioniert gut und nicht einfrieren, auch wenn ich es mit einigen Aktionen und Daten überlasten!

Kann mir jemand einige Tipps geben, was die möglichen Dinge sind, die eine Swing-Java-Anwendung solche Dinge machen können und wie ich die Leistung meiner Anwendung verbessern kann.Verbesserte Java-Anwendung

+0

Vielleicht helfen Ihnen: [Lektion:

wie so
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 } } } 

Und eine Aktion Hörer Concurrency in Swing] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/) – pzaenger

+0

Vielen Dank, ich werde es mir ansehen :) – SlimenTN

Antwort

3

Es kann viele Ursachen haben. Meine erste Schätzung wäre eine race condition irgendwo in Ihrem Code. Eine interessante Tatsache ist, wenn die Anwendung 0% CPU-Zeit oder 100% CPU-Zeit verwendet, während sie eingefroren erscheint. 0% würde anzeigen, dass einige Dinge aufeinander warten (Deadlock). 100% würde eine Endlosschleife anzeigen. Wenn Sie auf den Computer des Clients zugreifen können, können Sie möglicherweise einen Debugger mit der eingefrorenen Anwendung verbinden oder mit jstack einen Dump von Stacktraces erstellen.

+0

Netter Tipp danke besonders der "jstack" Ich brauche so etwas:) – SlimenTN

0

Eine Möglichkeit könnte große Aufgaben innerhalb des Swing-Thread ausgeführt werden, anstelle eines anderen Threads, zum Beispiel eine große Aufgabe innerhalb einer Action Ausführung:

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

Diese alle Benutzeroberfläche Teile, bis die Funktion zum Einfrieren verursachen würde kehrt zurück. Stellen Sie sicher, dass Funktionen wie diese tatsächliche Arbeit an einen neuen Thread übergeben oder Flags setzen, um in vorhandenen Threads zu arbeiten.

Zum Beispiel hat eine statische boolean in Main, die in der Hauptschleife geprüft:

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

hmm kannst du mir bitte ein beispiel über h geben Wie kann ich Flaggen setzen? – SlimenTN

+0

Und ja, du hast recht, ich habe einige große Aufgaben in einigen actionListeners. – SlimenTN

+0

Ich habe es mit einem Beispiel aktualisiert. Ein Flag wäre nur ein statischer Boolescher Wert, den Sie in der Hauptschleife überprüfen. Hoffe, das hilft :) – Drgabble

Verwandte Themen