Swing Java Swing Gui und nebenläufige Threads

rikischiki

Mitglied
Hallo zusammen. Ich bin bei der Programmierung eines kleinen Programmes auf ein Problem gestossen für das ich bisher noch keine Lösung gefunden habe. Es sei vorgewarnt das ich nicht allzuviel Erfahrung mit Java habe. Der Programmaufbau sieht folgendermassen aus:

[Gui] <----> [Controller/Datenfluss Klasse] <----> [Arbeiter/Berechnungsklassen]

Die Gui kommuniziert also über [Controller/Datenfluss Klasse] an die Arbeiterklassen weiter was berechnet werden soll. Die Gui/Swing komponente wird über folgenden Code in einem eigenen Thread gestartet:

[Java]
private static ProgramWindow mainProgramFrame;

javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
mainProgramFrame = new ProgramWindow(initialize);
mainProgramFrame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
[/Java]

Wenn nun über die Gui eine neue Berechnung eingeleitet wird, wird in den Arbeiterklassen wiederum ein eigener Thread erstellt, der die entsprechende Berechnung abarbeitet. Diese Arbeiter-Threads erstelle ich folgendermaßen:

[Java]
Thread createOrganismThread = new Thread(new CreateInitialOrganisms(this, organismDimension, organismCount));
createOrganismThread.start();
[/Java]

und die eigendliche Thread Klasse:

[Java]
public class CreateInitialOrganisms implements Runnable {

[...]

public void run() {

[Berechnung]

}

}
[/Java]

Das Problem das hierbei entsteht ist, dass die Gui zwar nicht blockiert, allerdings unfassbar langsam läuft und quasi nichtmehr zu gebrauchen ist. Ich hab es schon mit der Heruntersetzung der entsprechenden Priorität des Arbeiter-Threads probiert, aber immer mit dem selben Ergebniss - namentlich, die Gui ist nichtmehr sinnvoll benutzbar. Irgendwo wird hier denke ich etwas falsch gemacht, aber ich weis nicht wirklich wo. Der Arbeiter-Thread an sich greift auf keine Ressourcen von ausserhalb zu sondern sendet, wenn beendet seine Berechnungen zurück.
 
Zuletzt bearbeitet:

hansmueller

Bekanntes Mitglied
Hallo,

rikischiki hat gesagt.:
allerdings unfassbar langsam läuft und quasi nichtmehr zu gebrauchen ist
Wie äußert sich dieses, bzw. was ist langsam?

rikischiki hat gesagt.:
sendet, wenn beendet seine Berechnungen zurück.
Wohin wird das Ergebnis gesendet.

Was für eine Berechnung ist es? Wie lange dauert diese? Wartet irgendetwas auf das Ergebnis? Wie wird auf das Ergebnis gewartet? Werden evtl. ungewollt zu viele Threats erzeugt?

MfG
hansmueller
 

rikischiki

Mitglied
Ich habe hier mal ein kleines Beispiel zusammengestückelt das ihr euch schnell kompillieren könnt. Führt es aus und zieht das entstehende Fenster ein bisschen auf eurem Desktop rum. Es besteht aus folgenden zwei Klassen:

[Java]
import javax.swing.JButton;
import javax.swing.JFrame;

public class Init {

public Init () {

}

/**
* @param args
*/
public static void main(String[] args) {

Init init = new Init();

javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
JFrame frame = new JFrame("Test Threading");
JButton button = new JButton("Start");
frame.add(button);
frame.pack();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});

Thread workerThread = new Thread(new WorkerThread(init));
workerThread.start();
}

}
[/Java]


[Java]
import java.util.ArrayList;
import javax.swing.JFrame;


public class WorkerThread implements Runnable {

private ArrayList<JFrame> list;


public WorkerThread(Init init) {
list = new ArrayList<JFrame>();
}

@Override
public void run() {
for (int i = 0; i < 10000000; i++)
list.add(new JFrame());
}

}
[/Java]

Das Programm ist also wirklich nur eine minimale Gui und ein Thread, der JFrames erzeugt und auf eine ArrayList addet. (zweiteres um eine aufwändige Berechnung mit Speicherzugriff zu simulieren)

[EDIT] Ok, das Problem liegt an der .add() Methode der ArrayList. Sie verursacht anscheinend, dass auch die gesamte Gui blockiert wenn sie schnell hintereinander aufgerufen wird.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Auf die Idee, dass am Erstellen einen JFrames liegen könnte, könnte man auch kommen ;)
Schau' dir mal an, was beim erstellen eines JFrames intern so alles passiert. Wenn du aufgibst (nicht wenn du damit "fertig" bist, sondern wenn du aufgibst!) könntest du das z.B. durch einen Array ersetzen, oder eine ArrayList mit ArrayLists.

Ob es tatsächlich DIE Ursache ist, kann man kaum sagen, aber mit nicht-GUI-Objekten wäre das zumindest... "repräsentativer"...

EDIT: Eher im Gegenteil. Bei mir stottert er bei ArrayLists eher rum als bei JFrames...

EDIT2: An der add-Methode selbt kann es aber nicht liegen. Vermutlich eher an den Objektallokationen: Wenn man immer wieder dasSELBE Objekt in die Liste legt, ist er ruck-zuck fertig und scheint auch nicht zu blockieren. Müßte man aber noch ausführlicher testen.
 
Zuletzt bearbeitet:

twseitex

Mitglied
Hi,

meine Erfahrung unter Java SE: Graphik mit Threads ist langsam.

Allerdings habe ich in meinem Java-Audio-Player für Java SE wie folgt
GUI verbaut (applet, alles JKlassen).

1. Hautpklasse für Sound
2. Hauptklasse für GUI
GUI-Elemente des Fensters sind je eigene Klassen und bei
Animation wie scrollen mit je eigenen Threads.
Synchronisierung der GUI-Elemente per Thread der Hauptklase.
3. Applet, dass beide obigen Hauptklassen aktiviert.
Sound und GUI werden per Thread synchronisert.

Das Malen per paint() etc. ist in einem Thread hinterlegt, der
die Player-GUI refresht. Und da ist der Knackpunkt.

Events sind z.T. in GUI-Elemente-übergreifende Klassen hinterlegt,
die perdiodisch abgefragt werden müssen, da diese u.a.
die Sounds der Ecents der Buttons oder des Fensters
steuern.

Mit anderen Worten: Threads ohne Ende, die teilweise dynamisch
erzeugt, benutzt und geschlossen werden, so dass Java
aufräumt ohne Ende.
Ich arbeite mit vielen globalen Variablen, um Aufräumarbeiten
zu sparen.
Aufgrund der Vernetzung werden oft static Grössen verwendet.
Die komplette Kapselung, wie sie exakt OOP-treu wäre,
halte ich für unmöglich, wenn Graphic überhaupt
laufen soll.

Mein Player ist unter audio, flash and java zu finden. Die GUI-Problemen
werden in der GUI-Konfigurationsdatei erklärt, da dementsprechend
Einstellungen zur GUI-Steuerung zu treffen sind, z.B. Refreshrate
des Malen ...
Wenn sich jemand aus Neugierde das antun will, dann viel Vergnügen
beim Probieren :)

Noch etwas: Wer wirklich nicht durchhalten will, sollte Echtzeitprogrammierung
unter Java SE mit J-Klassen in Windows nicht angehen, sondern
Spezialversionen von Java benutzten, da diese - falls gepflegt werden -
einfacherer sein könnten, aber dann betriebsystemspezifisch.
Und letzteres kam für mich nicht in Frage, da nur Java SE
ziemlich verbreitet ist.

P.S: Alternative ist Flash und wer das nicht mag: Microsoft Net Framework
mit z.B. Silverlight. Flash habe ich auch ausprobiert.
Bei Microsoft bin ich etliche Male wegen Kompatibilitätsprobleme
auf die Schnauze gefallen: Microsoft schaltet gerne ab und man
hat dann für umsonst programmiert. Im Bereich Video nutze ich
Flash, Quicktime und HTML-5-Media (auch für Audio) kombiniert
mit Javascript. Mein Javaplayer für Audio ist einfach zu
ressourcenhungrig. Ergo: Java ist leider aussen vor und
Microsoft stellt sich bei mir hinten an, da ich Opera-Browser
empfehle, der auch von Anfang an HTML-5-Media kontinuierlich
kompatibel integriert hat (was Microsoft erst ab IE 9 mit
Google-Plugin-Krücke schafft). Wer die Kombination von
Audio und Video sehen will: Arbeitspapier: Analyse SGB II Grundsicherung für Arbeitsuchende (Hartz 4) aber Achtung,
diese Seite ist komplett eigenwillig programmiert. Wer
den Internet Explorer nutzt, sollte dann die HTML-Version
der Webseite angehen (die IE-Version ist z.T. anders angelegt
und prgrammiert und zwar speziell für den Internet Explorer 6
bis IE 8 - klar komplett ohne HTML-Media, dafür NUR mit etwas Flash
und - logisch - mit dem guten alten BGSOUND, also mp3).
Wer Firefox oder Seamonkey verwendet - diese Browser könnten arg
langsam sein. Safari und Google wurde nicht getestet.
Die Webseite benötigt aktive Soundboxen oder Kopfhörer.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
D Java Swing Cache AWT, Swing, JavaFX & SWT 0
T Java Swing Oberfläche aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
M Swing Java-Swing-Uebungen AWT, Swing, JavaFX & SWT 6
S Java Swing GUI mit MVC und Threads AWT, Swing, JavaFX & SWT 6
K Automatische Skalierung von GUI Elementen (Java Swing) AWT, Swing, JavaFX & SWT 2
A Java Swing Error AWT, Swing, JavaFX & SWT 3
D Layoutmanager in Java Swing vs. Java AWT AWT, Swing, JavaFX & SWT 3
J Swing MVC mit Java Swing, insbesondere die Controller-Struktur AWT, Swing, JavaFX & SWT 4
2 Werde Java GUIs immer noch mit dem in die Jahre gekommen Swing gemacht? AWT, Swing, JavaFX & SWT 12
S [Java+Scala] GUI mit Swing oder JavaFX AWT, Swing, JavaFX & SWT 6
A Swing LAF unter Windows: javax.swing.DebugGraphics cannot be cast to java.awt.Graphics2D AWT, Swing, JavaFX & SWT 5
T SWF in JAVA [Swing] AWT, Swing, JavaFX & SWT 4
I Java Swing - repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 4
S Beim Aufbau GUI: java.lang.IllegalAccessError in javax.swing AWT, Swing, JavaFX & SWT 6
D Probleme mit Java Swing unter Mac OSX AWT, Swing, JavaFX & SWT 13
M icons für die java.swing components wie jbutton etc AWT, Swing, JavaFX & SWT 5
N Java Swing Event Handling AWT, Swing, JavaFX & SWT 7
S Implementierung Java Swing HelloWorld - verständnisproblem AWT, Swing, JavaFX & SWT 3
oliver1974 Compiz-Fusion und Java/Swing. Hölle. AWT, Swing, JavaFX & SWT 6
C Architekturfrage Java Swing (MVC) AWT, Swing, JavaFX & SWT 3
M Java mit Swing - Elemente erst nach klick sichtbar AWT, Swing, JavaFX & SWT 13
A video-datei in java abspielen (SWING) AWT, Swing, JavaFX & SWT 8
M Java, Swing: MouseMotionListener AWT, Swing, JavaFX & SWT 19
Z Bei Problem mit Java Swing brauche dringende Hilfe AWT, Swing, JavaFX & SWT 3
N Swing startet nicht - java.lang.NoSuchMethodError: main AWT, Swing, JavaFX & SWT 8
L swing und java applet.keine Konflikt ,oder? AWT, Swing, JavaFX & SWT 3
P bmp in java-swing darstewllen AWT, Swing, JavaFX & SWT 2
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
Juelin Java <-> Delphi AWT, Swing, JavaFX & SWT 3
H Exceptions seit java: 1.6.0_65 Umstellung AWT, Swing, JavaFX & SWT 3
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M JavaFX java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found AWT, Swing, JavaFX & SWT 5
J Java GUI Dropdown-Menü anzeigen AWT, Swing, JavaFX & SWT 5
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
W Kennt jemand Dear ImGui (und den Java-Wrapper dazu)? AWT, Swing, JavaFX & SWT 0
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
D JAVA Schieberegler AWT, Swing, JavaFX & SWT 6
N JavaFX Einfacher Taschenrechner mit Scene Builder und Java FX AWT, Swing, JavaFX & SWT 0
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
P Fehlermeldung: Error: Could not find or load main class set Caused by: java.lang.ClassNotFoundException: set AWT, Swing, JavaFX & SWT 5
Encera Java FX im Eclipse-Marketplace nichtmehr auffindbar AWT, Swing, JavaFX & SWT 6
_user_q Versionscode aus build.gradle in Java-Klasse ausgeben lassen AWT, Swing, JavaFX & SWT 14
M Java Dateien kopieren mit Fortschrittsbalken AWT, Swing, JavaFX & SWT 13
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
E 3D-Grafik Java Fatal error bei LWJGL AWT, Swing, JavaFX & SWT 2
Heldderschatten Java Events und Interfaces AWT, Swing, JavaFX & SWT 18
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
E Java-TexturePaint sehr langsam AWT, Swing, JavaFX & SWT 9
N Java MySQL Datenbank durchsuchen? AWT, Swing, JavaFX & SWT 7
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4
imawake Java Paket-Tracking Programm 📦 AWT, Swing, JavaFX & SWT 7
izoards *.doc Seitenränder per Java setzen... AWT, Swing, JavaFX & SWT 14
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J Key-Listener in Java AWT, Swing, JavaFX & SWT 37
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
T Swing DPI-Skalierung und Java 2D unter Java 11 (und Windows 10) AWT, Swing, JavaFX & SWT 2
J Spiel mit Java AWT, Swing, JavaFX & SWT 9
I AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen AWT, Swing, JavaFX & SWT 14
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
N FXMLLoader.load java.lang.RuntimeException: Gradle AWT, Swing, JavaFX & SWT 2
T Java GUI - Würfel Programm AWT, Swing, JavaFX & SWT 6
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
dtr84 JavaFX/OpenJFX mittels Apache Ivy einbinden (Java 11) AWT, Swing, JavaFX & SWT 18
M Jogl und Java 3d AWT, Swing, JavaFX & SWT 0
S0PEX JavaFX Java 8 auf 15 migrieren OpenJFX mit Gradle eingebunden, jedoch nicht gefunden !? AWT, Swing, JavaFX & SWT 4
I Gui in bestehendes Java-Programm AWT, Swing, JavaFX & SWT 11
V Java-Zeichenfeld mit AWT AWT, Swing, JavaFX & SWT 3
N java Gui friert scheinbar zufällig ein AWT, Swing, JavaFX & SWT 5
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben