Daten bearbeiten ohne GUI zu blockieren - daten haltung/zurück geben

LokiA

Mitglied
Hi,

Ich bearbeite gerade eine sehr alte Java Swing Applikation und sehe schrecklichen code vor mir.
Um sie besser zu machen muss ich einiges in Threads auslagern, damit die GUI nicht blockiert wird.
Dabei stehe ich vor dem Problem, dass ich Daten in einem Thread bearbeiten muss die aber in der Class liegen und nicht übergeben werden (wobei ich die rückgabe eh auch nciht gelöst hätte)

Bei meiner Suche habe ich folgendes gefunden:
https://www.java-tips.org/java-se-t...ong-running-tasks-in-a-swing-application.html

was ich hier sehe finde ich sehr interessant finde - das GOOD example - hier wird nicht wirklich per "return" etwas zurück gegeben wird sondern von einem weiteren thread die werte im EDT direkt gesetzt (was ich für sehr komfortable halte, da es mir einfacher erscheint als einen "return" basierten weg zu bauen).
Nur verstehe ich daran nicht wieso das erlaubt ist/besser / anders ist als wenn nur über einen Thread liefe oder "bad2". Das sollte doch auch nicht thread-safe sein.
 

Flown

Administrator
Mitarbeiter
Die Lösung "good" startet einen eigenen Thread (new Thread().start()) und setzt nach dem Ende das Ergebnis im EDT (SwingUtilities.invokeLater). Darum wird das als "gut" bezeichnet.
Der EDT arbeitet alle UI spezifischen Sachen ab und mit SwingUtilities#invokeLater kann man Abläufe in den EDT einreihen. Darum ist die Lösung 2 schlecht. Es wird ein Thread#sleep eingebracht der den EDT blockiert.

Die Lösung "good" ist zwar gut im Sinne von Threading, aber nicht im Sinne von gut gelöst. Threads sollte man heutzutage nicht mehr händisch starten und es gibt SwingWorker, die das auch mit dem EDT handlen.
 

LokiA

Mitglied
Stimmt jetzt sehe ich das auch beim "bad2" - dachte wohl erst dass es ein normaler thread wäre der gestarted wurde.

Ich kenn mich mit Swing nicht so aus. Werd mir den SwingWorker wohl noch ansehen müssen.

Ich würde eben gerne eine Anwendung so abändern, einige langlaufende Objekt Initialisierungen in einen anderen Thread zu verschieben allerdings im EDT auf die Komplettierung zu NICHT Blockierend warten (und die Objekte auch wieder da zu haben). Ist der SwingWorker das richtige? Parallelisieren (sind manchmal 3 manchmal 8 zu initialisierende Objekte) ist ja schon mal nicht möglich, aber auch nicht so wichtig.
 

mihe7

Top Contributor
und sehe schrecklichen code vor mir.
:D

dass ich Daten in einem Thread bearbeiten muss die aber in der Class liegen
Wie soll ich das verstehen?

Parallelisieren (sind manchmal 3 manchmal 8 zu initialisierende Objekte) ist ja schon mal nicht möglich, aber auch nicht so wichtig.
Warum ist parallelisieren nicht möglich?

Am besten ist, Du zeigst das Problem mal anhand von wenig(!) Code.
 
X

Xyz1

Gast
Boahhh, mihe7, bist du früh wach :D
@LokiA die Kommentare sind etwas aufschlussreich schon:

// We're going to do something that takes a long time, so we
// spin off a thread and update the display when we're done.

// We're going to do the same thing, but not in a
// separate thread.

// The wrong way to use invokeLater().
// The runnable() shouldn't starve the dispatch thread.

Die GUI sollte nicht "blockieren" und mEn brauchen UI Operationen auch nich immer im EDT solange der main T nicht blockiert....
 

LokiA

Mitglied
Wie soll ich das verstehen?
Ich meinte damit auf die variablen der Klasse aus verschiedenen Threads zu zugreifen, ist ja nciht so gut oder? (Kenne mich mit GUIS, EDT und co ned aus)

Warum ist parallelisieren nicht möglich?
Ich meine jetzt mit dem SwingWorker - der arbeitet das ja hintereinander ab.

... brauchen UI Operationen auch nich immer im EDT solange der main T nicht blockiert....
OK jetzt bin ich verwirrt ... dachte der EDT ist mehr oder weniger in einer GUi applikation der EDT

Java:
public class ApplicationFrame extends JFrame {
// Sample Variable
private DataObject prametersObj;
// some UI components
private JSplitPane splitContentPane;
private JPanel contentPaneProgressBar;
private JPanel contentPaneMainGui;
// ...
// Controller class
private superController controller;
private List<SubModul> subModules;

public static void main(String[] args) {
// process arguments ...
EventQueue.invokeLater(new Runnable() {
public void run() {
ApplicationFrame appFrame = new ApplicationFrame();
appFrame.setArguments(arguments);
appFrame.setVisible(true);
appFrame.setLocationRelativeTo(null);
appFrame.init();
}
});
}

public void init() {
// creates a UI with a ProgressBar and sets in getContentPane()
if (!init_ProgressBar()) {
return;
}

showProgressBar("Initializing the ApplicationFrame ...", 1);
// parses some arguments and sets the Parameters in the prametersObj
if (!init_Parameters()) {
showProgressBar("Initializing parameters failed ...", 1);
return;
}

showProgressBar("Initializing GUI ...", 33);
// creates the rest of the UI, but does not set in getContentPane() (so is still hidden)
if (!init_View()) {
showProgressBar("Initializing GUI failed ...", 33);
return;
}

showProgressBar("Loading Sub modules ...", 66);
// sets superController and inits it
// loads all sub modules & instantiates them and stores them in a list (subModules)
// set up the Menu (entry per subModule + handler -> on klick get view of submodul and put on UI)
if (!load_SubModules()) {
showProgressBar("Loading sub modules failed!", 66);
return;
}

showProgressBar("Initialization finished.", 100);
}
}

Das ist der Code als Beispiel Code.
Die Submodule kenne ich nicht als code (die dürften besser sein).
Die "load_*" Methoden nutzen kein threading etc ...
logischerweise ist dann das "showProgressBar" nutzlos da alles im EDT läuft.

eine einfache lösung wäre wohl nach dem "good" approach vorgehen.
dabei würde ich eine Kette machen:
Init ruft über einen Thread die "load_*" Methoden auf die in einem "invokeLater" call back den ProgressBar updated und den nächsten part der initialiserung startet die dann wieder über einem "invokeLater" call back den ProgressBar updated ... usw.

das sollte klappen (habe tests gemacht) sieht aber unübersichtlich aus und ich frage mich ob das OK ist,
was den zugriff auf die variablen der classe an geht aus verschiednen Threads vs EDT
 
X

Xyz1

Gast
SwingWorker könnte alle Abhängigkeiten via Konstruktor oder setter erhalten ohne von SwingWorker abzuleiten MEn....
 

LokiA

Mitglied
Musst Du nicht. Schau Dir mal das Beispiel "PrimeNumberTask" in der Doku an (https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingWorker.html)
Werde ich mir versuchen in den nächsten zwei Wochen an zu sehen - sind aber keine vollständigen Beispiele - was ich daher noch nicht verstehe/unsicher ist - wie es eben mit dem Zugriff auf die variablen aus mehreren Threads ist. Ist das kein Problem?

Danke auch sonst für die Komentare - composition over inheritance - sind sachen die man kennt - aber wenn man so wie ich nicht so oft entwickelt immer weider vergisst - und so bleibt es warm :)
 

mihe7

Top Contributor
was ich daher noch nicht verstehe/unsicher ist - wie es eben mit dem Zugriff auf die variablen aus mehreren Threads ist. Ist das kein Problem?

Ich verstehe nicht ganz: auf welche Weise und auf welche Variablen willst Du denn von mehreren Threads aus zugreifen? Es ging doch gerade darum, nicht zu parallelisieren.
 

LokiA

Mitglied
Ich verstehe nicht ganz: auf welche Weise und auf welche Variablen willst Du denn von mehreren Threads aus zugreifen? Es ging doch gerade darum, nicht zu parallelisieren.
Naja, d.h. aber nur dass nicht parallel zugegriffen wird- zugegriffen wird ja trotzdem.
z.B in meinem Sample code in den einem Thread (der zB. in init_ProgressBar() / load_SubModules()) auf prametersObj oder contentPaneMainGui oder controller.
 

mihe7

Top Contributor
Mal einfach: sobald Du in mehreren Threads auf eine Variable zugreifst und dabei die Variable veränderst, musst Du den Zugriff synchronisieren.

Alles, was UI betrifft, muss im EDT laufen, ggf. musst Du - aus einem anderen Thread heraus - mit der Methode invokeLater in EventQueue bzw. SwingUtilities dafür sorgen. Beim SwingWorker wird vereinfacht, dass man a) aus dem Hintergrund heraus den Fortschritt sicher aktualisieren kann (wird im EDT ausgeführt) und b) ein (Zwischen)-Ergebnis im Hintergund berechnen und im EDT verwenden kann (publish/process bzw. done/get).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JTable Daten bearbeiten und Grauwertbild erzeugen! AWT, Swing, JavaFX & SWT 4
D TableModel + Daten bearbeiten + Daten zurückschreiben AWT, Swing, JavaFX & SWT 9
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
W Daten von Controller zu Controller übertragen AWT, Swing, JavaFX & SWT 7
D Columns unabhängig voneinander mit Daten füllen JavaFx AWT, Swing, JavaFX & SWT 1
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
T Anbinden der Tabelle an die Daten AWT, Swing, JavaFX & SWT 5
F JavaFX Tabelle mit Daten füllen AWT, Swing, JavaFX & SWT 9
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
ralfb1105 JavaFX Daten zwischen Controller "austauschen" AWT, Swing, JavaFX & SWT 65
B AWT Bot um Daten auf Website einzugeben und die Antwort zu bekommen AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
ralfb1105 Swing Dynamischer Graph zum anzeigen Perfomance Daten AWT, Swing, JavaFX & SWT 35
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
K TreeTableView (cellFactory) - wie Daten in Spalten einfügen AWT, Swing, JavaFX & SWT 0
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
J TableView Daten werden nicht ausgegeben AWT, Swing, JavaFX & SWT 9
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
T JavaFX Model Daten übergeben AWT, Swing, JavaFX & SWT 4
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
J JavaFX Tableview Daten hinzufügen aus anderer Klasse AWT, Swing, JavaFX & SWT 7
J Tableview Daten hinzufügen und aktualisieren AWT, Swing, JavaFX & SWT 5
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
S JavaFX (Best Practise) Daten zwischen Controllern austauschen AWT, Swing, JavaFX & SWT 1
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
L JavaFX Verzögerung beim Laden von Daten AWT, Swing, JavaFX & SWT 6
L Daten in neuem Fenster AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
S JTable Daten aus Array AWT, Swing, JavaFX & SWT 9
M Java FX Daten an Controller übergeben AWT, Swing, JavaFX & SWT 3
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
M JavaFX Von FXML-Controllerdatei Daten zurückgeben AWT, Swing, JavaFX & SWT 6
F JavaFX Daten aus Tabelle in ComboBox AWT, Swing, JavaFX & SWT 9
B Swing JTable mit Daten - Reihen-Größe anpassen AWT, Swing, JavaFX & SWT 0
D Applet GWT speichert Daten nicht in Datenbank AWT, Swing, JavaFX & SWT 2
S SWT In Listen den Einträgen Daten zuordnen AWT, Swing, JavaFX & SWT 2
T SWT Table (mit Spinner Spalte) Daten auslesen AWT, Swing, JavaFX & SWT 4
F Swing JTable: Daten voreinstellen AWT, Swing, JavaFX & SWT 4
B Daten in eine JTable schreiben AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
J valueChanged()-Methode liefert unbrauchbare Daten AWT, Swing, JavaFX & SWT 4
B Datenübergabe zwischen Tabs und Daten speichern AWT, Swing, JavaFX & SWT 2
D SWT TreeViewer: Daten aus Model gelöscht... trotzdem noch im Baum AWT, Swing, JavaFX & SWT 4
D Daten von JDialog an JTable in JFrame übergeben AWT, Swing, JavaFX & SWT 7
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
H JTable zeigt keine Daten an AWT, Swing, JavaFX & SWT 5
M Swing Daten von JPanel zu JFrame senden AWT, Swing, JavaFX & SWT 13
C Swing JTable Daten einfügen AWT, Swing, JavaFX & SWT 6
Ollek IndexOutOfBoundsException bei neuen Daten in JTable AWT, Swing, JavaFX & SWT 13
J Swing JTable-Daten Speichern und bei zeilen-änderung beibehalten. AWT, Swing, JavaFX & SWT 6
A Daten umherschieben zwischen zwei Klassen AWT, Swing, JavaFX & SWT 40
L [SWT] Daten und Bilder drucken AWT, Swing, JavaFX & SWT 2
M Trotz richtiger Daten, falsches Bild wird gezeichnet?! AWT, Swing, JavaFX & SWT 4
O JFrame: Daten alle paar Sekunden aktualisieren AWT, Swing, JavaFX & SWT 3
C Daten aus DB -> JTable aktualisieren klappt nicht AWT, Swing, JavaFX & SWT 16
A Swing(Daten zugreifen) AWT, Swing, JavaFX & SWT 25
S JComboBox - veränderliche Daten AWT, Swing, JavaFX & SWT 6
T Daten mittels ComboBox in ein JTable adden AWT, Swing, JavaFX & SWT 7
Ollek Realisierung: JTable zur Laufzeit mit neuen Daten füllen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing jTable Daten unsichtbar AWT, Swing, JavaFX & SWT 12
T JTree Daten in DB schreiben am besten SQL AWT, Swing, JavaFX & SWT 21
W Daten auf Textfeld in anderer Klasse verwenden AWT, Swing, JavaFX & SWT 4
T Daten der gesamten Woche anzeigen AWT, Swing, JavaFX & SWT 2
D Problem mit JFileChooser -> Daten werden mit anführungsstriche in JTable geschrieben AWT, Swing, JavaFX & SWT 8
H JList zeigt die Daten aus dem Array nicht an! AWT, Swing, JavaFX & SWT 13
E Daten von JDialog nach JFrame übertragen AWT, Swing, JavaFX & SWT 4
K TableModel mit Daten aus Datenbank füllen AWT, Swing, JavaFX & SWT 7
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
L Swing Daten in JTable aktualisieren AWT, Swing, JavaFX & SWT 5
H Swing Tabelle nach Klick auf Button mit Daten füllen? AWT, Swing, JavaFX & SWT 2
B Swing JList Daten löschen AWT, Swing, JavaFX & SWT 13
R Swing XML Datei in JTree, Problem mit Daten einlesen AWT, Swing, JavaFX & SWT 34
A SWT: Daten in Raster mit Gitternetzlinien darstellen AWT, Swing, JavaFX & SWT 7
C Swing JTextField-Daten über mehrere Dialoge AWT, Swing, JavaFX & SWT 18
K TableModel Daten übergeben AWT, Swing, JavaFX & SWT 9
Milady Swing Änderung von Daten mit sql AWT, Swing, JavaFX & SWT 2
J Daten aus einer Textdatei in ArrayList holen AWT, Swing, JavaFX & SWT 9
X Swing Daten aus Vector ins TableModel ?? AWT, Swing, JavaFX & SWT 12
T Swing Liste von Daten anzeigen AWT, Swing, JavaFX & SWT 4
S Swing Daten aus Datenbank in JTable AWT, Swing, JavaFX & SWT 2
E JCombobox mit Daten aus DB füllen AWT, Swing, JavaFX & SWT 9
L Daten werden in JTable nicht angezeigt:( AWT, Swing, JavaFX & SWT 6
Milady Annzeigen alle Daten aus der Tabelle AWT, Swing, JavaFX & SWT 6
P Swing Liste von Daten auf JFrame AWT, Swing, JavaFX & SWT 6
E Daten aus sortierter Tabelle lesen AWT, Swing, JavaFX & SWT 2
X Swing JList -> Daten anders darstellen als im Model hinterlegt -> möglich ? AWT, Swing, JavaFX & SWT 9
X Doppelte Daten in DefaultListModel unterbinden AWT, Swing, JavaFX & SWT 3
ModellbahnerTT SWT Daten zur nächsten WizardPage senden AWT, Swing, JavaFX & SWT 4
J Daten in JTable nach Sortierung auslesen AWT, Swing, JavaFX & SWT 2
hdi Swing JTable & Filtern: Daten nicht in der View AWT, Swing, JavaFX & SWT 2
S JTable Bug - eingegebene Daten werden falsch geparst :( AWT, Swing, JavaFX & SWT 4
L AWT Daten vom Dialog an Frame senden AWT, Swing, JavaFX & SWT 3
hdi Swing JTable: Löschen vom Daten im Model AWT, Swing, JavaFX & SWT 7
U JTable mit Daten aus einer HashMap füllen AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben