Threads Multithread in JavaFx

Kababär

Top Contributor
Hi,

ich probiere mich gerade etwas an Threads aus.
Ich habe eine GUI, die eine TextArea hat und in dieser will ich nun Zahlen hochzählen lassen, flüssig, und dabei nur die Zahl updaten.
Sobald die Zahl an ihrem Maximum ist, will ich mir eine HTML-Datei zusammenstellen.
Leider habe ich folgende Probleme:
1.
Die TextArea scheint Probleme damit zu haben, schnelle Updates entgegen zu nehmen, weswegen ich ein Thread.Sleep(x); einbauen musste. Ab x<24 kommt eine NP-Ex von JavaFX.
Java:
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:418)
    at java.util.ArrayList.get(ArrayList.java:431)
    at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89)
    at com.sun.javafx.collections.VetoableListDecorator.get(VetoableListDecorator.java:306)
    at javafx.scene.Parent.updateCachedBounds(Parent.java:1583)
    at javafx.scene.Parent.recomputeBounds(Parent.java:1527)
    at javafx.scene.Parent.impl_computeGeomBounds(Parent.java:1380)
    at javafx.scene.layout.Region.impl_computeGeomBounds(Region.java:3078)
    at javafx.scene.Node.updateGeomBounds(Node.java:3577)
    at javafx.scene.Node.getGeomBounds(Node.java:3530)
    at javafx.scene.Node.getLocalBounds(Node.java:3478)
    at javafx.scene.Node.updateTxBounds(Node.java:3641)
    at javafx.scene.Node.getTransformedBounds(Node.java:3424)
    at javafx.scene.Node.updateBounds(Node.java:559)
    at javafx.scene.Parent.updateBounds(Parent.java:1711)
    at javafx.scene.Parent.updateBounds(Parent.java:1709)
    at javafx.scene.Parent.updateBounds(Parent.java:1709)
    at javafx.scene.Parent.updateBounds(Parent.java:1709)
    at javafx.scene.Parent.updateBounds(Parent.java:1709)
    at javafx.scene.Parent.updateBounds(Parent.java:1709)
    at javafx.scene.Parent.updateBounds(Parent.java:1709)
    at javafx.scene.Parent.updateBounds(Parent.java:1709)
    at javafx.scene.Parent.updateBounds(Parent.java:1709)
    at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2404)
    at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
    at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
    at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException

Den Parameter habe ich auf 25 eingestellt, dies dauert aber unnötig lange.
2.
Als ich die Zahl hochzählen Methode fertig hatte, habe ich die zweite Methode für die HTML-Datei implementiert. Der Effekt, dass die GUI kontinuierlich geupdatet wurde, verschwand (Leider, denn deswegen habe ich doch erst Threads mit eingebaut).
Je eine Methode läuft in einem seperaten Thread. Als ich debuggt habe, stand ich aber auf einmal im zweiten Thread statt im ersten, was falsch ist, denn die Threads sollten sequentiell ablaufen, da Thread 1 Vorkehrungen/Vorbereitungen für Thread 2 trifft.
Läuft Thread 2 als Erstes, endet das Programm in einem NP-Ex Massaker.
Ein thread.join regelt zwar den Ablauf, unterdrückt aber weiterhin das GUI-Update von Thread 1.
Viel geredet, hier der Code:

Code:
    private void startCompareTask() {
        textAreaV.appendText("Dateien werden eingelesen.\n");

        Task task = new Task<Void>() {

            @Override
            public Void call() throws Exception {
                textAreaV.appendText("Bereite Dateien vor.\n");

                List<String> listFile1 = StringUtil.fileToLines(file1);
                textAreaV.appendText("Unterschiede gefunden : suche");

                for (int i = 0; i < listFile1.size(); i++) {

 
                            gnrRev.setAreDiff(true);
                            textAreaV.end();
                            textAreaV.selectPreviousWord();

                            textAreaV.replaceSelection(String.valueOf(++counter));

                            Thread.sleep(5);
                        
                    }
                    updateProgress(counter, listFile1.size());

//                    counter++;
                }
                if (counter == 0) {
                    textAreaV.end();
                    textAreaV.selectPreviousWord();
                    textAreaV.replaceSelection("Keine");
                }
                textAreaV.appendText("\nFertig!");
                updateMessage("Finished");
                return null;
            }
        };
        thCompare = new Thread(task);
        thCompare.setDaemon(true);
        thCompare.start();

    }

Code:
private void startHtmlTask() {
        Task task = new Task<Void>() {

            @Override
            public Void call() throws Exception {
                textAreaV.appendText("\nSchreibe HTML-Datei.");

                new HtmlBuilder("test", "Test", true).buildAndCreateHtml("einPfad.html");
                return null;
            }
        };
        thHtml = new Thread(task);
        thHtml.setDaemon(true);
        thHtml.start();
    }

Code:
@FXML
    public void handleClick() throws IOException, InterruptedException {
startCompareTask();
thCompare.join();
startHtmlTask();
}

Ich hoffe es ist nicht all zu viel.
 

VfL_Freak

Top Contributor
Wenn ich Thread.Sleep(); weglasse oder die Parameter-Zahl weiter runterdrehe, kommt dieser Fehler.
Bitte was??
Was sollte der Aufruf von Sleep rsp. der dabei übergebene Zahlenwert denn mit der Indexverletzung eines Arrays zutun haben ??
Habe zwar den Code auch nur sehr lax überflogen, da er mir ein bisschen zu sehr 'hingeklatscht' ausschaut ....

Du solltest mit einem Debugger leicht feststellen können, wo die AIOOB-Exception fliegt (und warum) und zumindest diese Codestelle genauer benennen!

Gruß Klaus
 

VfL_Freak

Top Contributor
nein, ich meinte: hier ins Forum geklatscht !!

Kommt nun eine NPE oder eine AIOOB-Exception??
Von einer NPE steht nix im StackTrace !!

Was allerdings irritiert, dass beide Threads relativ zügig mit "return null" enden .....

Gruß Klaus
 

Kababär

Top Contributor
Gut beobachtet, das ist wohl mein Fehler. Es kommt eine AIOOB, die ich aber jetzt behoben habe.
Statt der for-Schleife in Methode 1 habe ich eine foreach-Schleife benutzt und jetzt geht es.
Auch ohne Thread.sleep() funktioniert es nun super.
Wieso das von mir beobachtete Verhalten (mit Thread.sleep()) nun auftrat, kann ich nicht erklären.


Eine Idee, wieso meine GUI nicht geupdatet wird?
 

Kababär

Top Contributor
Naja ich dachte das wäre klar. Ich habe doch nur ein GUI-Element in menem Code.
Also:
Was genau meinst Du denn?
Meine TextArea soll den Benutzer darüber informieren, was gerade passiert. Aus diesem Grund will ich meine TextArea nach und nach mit mehr oder weniger nützlichen Informationen befüllen.

WO sollte WAS upgedatet werden ??
Wo? Über all da wo " textAreaV.appendText...." vorkommt! Und zwar in den Methoden
"startCompareTask();" und "startHtmlTask();"!
Was? Mein einziges GUI-Element -> Das TextArea.

Noch Fragen?
 

Kababär

Top Contributor
Ich arbeite mit JavaFX, da gibt es kein append. Aber daran liegt es nicht. Wenn ich (in Spoiler 3) die Methoden bzw. Zeilen
Code:
thCompare.join();
startHtmlTask();
auskommentiere, funktioniert das Updaten der TextArea wie gewohnt wieder.
Sobald ich aber auch nur "thCompare.join();" Zeile wieder aktiv schalte (Kommentare löschen), wird die GUI nicht mehr geupdated.

Also: ich dachte, dass Thread.join() wartet, bis der Thread abgeschlossen ist, wenn man erst nachdem der Thread beendet wurde, weiter machen will. In meinem Fall: ich will warten bis der thCompare-Thread fertig ist, dann den nächsten Thread starten. Aber es scheint als ob join() dafür sorgt, dass die GUI nun nicht mehr geupdatet wird. Blocke ich hier irgendwo den GUI Thread?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
B Multithread mode funktioiernt nicht wie gewünscht Java Basics - Anfänger-Themen 4
V Multithread NullPointerException verhindern Java Basics - Anfänger-Themen 8
D Multithread Sockets"Address already in use"Error Java Basics - Anfänger-Themen 11
G Multithread /DatagramPacket Problem Java Basics - Anfänger-Themen 3
Juelin Netbeans mit JavaFX, FXML und Scenebuilder Java Basics - Anfänger-Themen 11
Juelin javaFX mit Elementen Java Basics - Anfänger-Themen 6
Juelin Netbeans und javafx Java Basics - Anfänger-Themen 6
M Wo den Ordner javafx-sdk-21.0.2 unter Linux ablegen? Java Basics - Anfänger-Themen 5
A Kapazität JavaFX TextField Java Basics - Anfänger-Themen 4
L JavaFX - grundlegende Verständnisprobleme Java Basics - Anfänger-Themen 1
S JavaFX Java Basics - Anfänger-Themen 1
A JavaFX-Anwendung läuft nicht mit Selenium WebDriver Java Basics - Anfänger-Themen 0
A JavaFX Toggle_Button_Disable Java Basics - Anfänger-Themen 2
ac83 JavaFX - Kompilierungsproblem Java Basics - Anfänger-Themen 1
R Intellij javafx --> jar Java Basics - Anfänger-Themen 11
O Compiler-Fehler JavaFX fmxl LoadExeption Java Basics - Anfänger-Themen 4
M Javafx Timeline Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
A JavaFX-Filechooser Java Basics - Anfänger-Themen 5
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
A JavaFx - SceneBuilder Java Basics - Anfänger-Themen 5
S JavaFX - Objekt an neue Stage übergeben Java Basics - Anfänger-Themen 12
G Javafx Eventhandler zu jedem Node Java Basics - Anfänger-Themen 1
T Elemente aus Array zu TableView JavaFX übertragen Java Basics - Anfänger-Themen 2
T HTMLEditor JavaFX Java Basics - Anfänger-Themen 4
E JavaFX Editor Probleme mit der Zwischenablage Java Basics - Anfänger-Themen 12
E JavaFX Taschenrechner Eingabe im Textfield beschränken Java Basics - Anfänger-Themen 2
D Mit Objekten rechnen, Textfield, JavaFX, Noob Java Basics - Anfänger-Themen 8
P Probleme bei der Installation von JavaFX Java Basics - Anfänger-Themen 3
R Umsetzungsplan JavaFx App Java Basics - Anfänger-Themen 9
M JavaFX- Verschiedene Stages Java Basics - Anfänger-Themen 1
P JavaFx einrichten Java Basics - Anfänger-Themen 6
Torsten.E JavaFX mit Visual Studio Code verwenden Java Basics - Anfänger-Themen 1
P JavaFX: Verständnisproblem bei ComboBox/ChoiceBox etc. Java Basics - Anfänger-Themen 9
T Javafx ListView kann nicht gefüllt werden. Java Basics - Anfänger-Themen 6
D JAVAFX WebVIEW zu JSOUP Java Basics - Anfänger-Themen 3
D Folgende Fehlermeldung bei der Installation von JAVAFX Java Basics - Anfänger-Themen 1
S JavaFX-Arduino Kommunikation mit LCD-Anzeige Java Basics - Anfänger-Themen 0
B java.lang.NullPointerException bei javafx Java Basics - Anfänger-Themen 10
J javafx mediaplayer mit https Java Basics - Anfänger-Themen 3
J JavaFX Label,Button zur Laufzeit Java Basics - Anfänger-Themen 30
D Ausführbare jar/exe aus JAVAFX Projekt erstellen (IntelliJ) Java Basics - Anfänger-Themen 14
O JavaFX XML Versuch Java Basics - Anfänger-Themen 2
O JavaFX Java Basics - Anfänger-Themen 7
M JavaFX-Übung Autospiel Java Basics - Anfänger-Themen 4
M JavaFX: Fenster bleibt weiß Java Basics - Anfänger-Themen 3
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
J Aktuelle Zeit in einer JavaFX Anwendung aktualisieren lassen Java Basics - Anfänger-Themen 4
L JavaFx ListView rechts abgeschnitten Java Basics - Anfänger-Themen 0
I Javafx Tabpane Reiter blockieren Java Basics - Anfänger-Themen 1
S JavaFX Beginneraufgabe Java Basics - Anfänger-Themen 1
W JavaFX import Fehler/Zellularautomaten Java Basics - Anfänger-Themen 1
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
CptK mit javafx button erstellen Java Basics - Anfänger-Themen 1
U Javafx Array aus Buttons Java Basics - Anfänger-Themen 2
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
E JAvaFX: Verschiedene Panels nach Klick auf Node des TreeView anzeigen Java Basics - Anfänger-Themen 0
K Erste Schritte JavaFX - wie von "externer" Klasse auf Methoden des Controllers zugreifen Java Basics - Anfänger-Themen 2
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
D JavaFX, Verweis auf Datei im Projekt Java Basics - Anfänger-Themen 0
M JavaFX in Swing-Applikationen einbetten Java Basics - Anfänger-Themen 5
M JavaFX: Problem mit der TableView Java Basics - Anfänger-Themen 0
P JavaFX ohne FXMLLoader Java Basics - Anfänger-Themen 3
K JavaFX UI controls Java Basics - Anfänger-Themen 1
B Farbverlauf erstellen ohne Javafx, AWT usw.? Java Basics - Anfänger-Themen 34
H Best Practice JavaFX TableView mit Zell-Rahmen anstelle von Zeilen-Balken Java Basics - Anfänger-Themen 1
M Ausgabe eines Arrays auf Label (Javafx) Java Basics - Anfänger-Themen 4
R Threads in JavaFX Java Basics - Anfänger-Themen 3
N JavaFX - (Controller) - Klasse verkleinern Java Basics - Anfänger-Themen 8
U JavaFX eine Vbox Instanz pro Pane? Java Basics - Anfänger-Themen 2
Spencer Reid JavaDoc zu JavaFx hinzufügen Java Basics - Anfänger-Themen 1
V wie kann man am einfachsten für ein Element der JavaFX die Umrandung aktiwieren ? auch ohne css ? Java Basics - Anfänger-Themen 4
D OOP JavaFX objektorientiert Java Basics - Anfänger-Themen 2
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
P JavaFX - Komponenten skalieren Java Basics - Anfänger-Themen 16
P JavaFX Textfelder geben immer null zurück Java Basics - Anfänger-Themen 8
P JavaFX TextArea.setText Java Basics - Anfänger-Themen 13
F javafx.fxml.LoadException: Root hasn't been set. Java Basics - Anfänger-Themen 0
J JavaFX aus Java-Application heraus starten Java Basics - Anfänger-Themen 7
T Swing, SWT oder JavaFX Java Basics - Anfänger-Themen 8
S [JavaFX 2.1] - Eigene Sprachauswahl? Java Basics - Anfänger-Themen 4
D Javafx XYChart Variable in Schleife erzeugen? Java Basics - Anfänger-Themen 18
E JavaFX und Java auf Kommandozeile compilen Java Basics - Anfänger-Themen 2
J Webanwendung JavaFX Java Basics - Anfänger-Themen 4
Povlsen84 [javafx] Zusammenarbeit mit Tomcat Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben