SwingUtilities.invokeLater - Wie verwenden für meinen Code?

I

invokeLater

Gast
Servus Forum,

ich arbeite gerade an einer Aufgabenstellung, die darum geht, einen simplen Download Client zu erstellen.
Großteile des Codes sind schon vorgegeben, die Aufgabe besteht darin diesen multithreadbar zu machen, sodass mehrere downloads auf einmal laufen können.

Kurze Beschreibung wie das Ganze aufgebaut ist :
Es gibt das Main-Frame. In diesem wählt man den Pfad der zu downloadenen Datei aus.
Beim Klicken auf "Download" wird dann ein "SaveTo"- Dialog geöffnet, also ein Dialog in dem man den Pfad zum Speichern der Datei auswählt, angelegt.
Dann wird eine Insantz der "DownloadFrameThreaded" Klasse aufgerufen. Das ist im Prinzip ein Frame, das einfach nur eine ProgressBar entählt und einen Button zum Abbrechen des Downloads.

Im Konstruktor von DownloadFrameThreaded erzeuge ich einen DownloadThread. Diesem übergebe ich eine Referenz auf this, damit er Zugriff auf die Methoden zum updaten der ProgressBar von DownloadFrameThreaded hat.

DownloadThread erbt von Thread und überschreibt run(). In run geschieht der gesamte Downloadprozess mit regelmäßigem updaten ( alle 250 ms ) der ProgressBar von DownloadFrameThreaded.
Das funktioniert alles auch wunderbar so, ich kann mehrere Files gleichzeitig downloaden, die ProgressBars werden upgedatet, etc.

Jetzt werden 2 weitere Sachen verlangt, die mir Probleme bereiten :
a ) Wenn der Benutzer in dem DownloadedFrameThreaded auf den Cancel-Button drückt, soll der DownloadThread "gegenfalls" interrupted werden.
Momentan hat das Drücken auf den Cancel-Button eigentlich schon den gewünschten Effekt. Die run()-Methode in DownloadThread hat eine while ( !downloadFrame.isCancelled() ) Schleife. Beim Drücken auf "Cancel" wird isCancelled in DownloadFrameThreaded auf true gesetzt und somit terminiert die Schleife sobald wieder runtime an den Thread gegeben wird und er diese Variable überprüft.
Natürlich wird vorher noch schön aufgeräumt.

So, jetzt verstehe ich nicht, wieso ich noch per interrupt den Thread terminieren soll? ( Na gut, die Aufgabenstellung behauptet das wäre effizienter, da der Rump von run() nicht noch mal ausgeführt wird. Aber ob ein interupt-call schneller ist, naja ... )

1. wirft das eine Exception mit der ich nichts anzufangen weiß. Sie einfach nur zu fangen und nichts damit zu machen fühlt sich falsch an.
2. steht in der Aufgabenstellung "gegebenfalls". Das impliziert, dass ich vorher irgendwas überprüfen soll? Aber ich wüsste nicht was ;/

b) Das größere Problem : Swing ist ja bekannterweise nicht Threadsicher. Und ich versuche von einem anderen Thread als dem Swing-Thread aus GUI-Komponenten upzudaten. Momentan funktioniert das wunderbar, aber ist wahrscheinlich UB.
Deshalb verlangt die Aufgabenstellung, dass man die Methoden, die die ProgressBar updaten, beispielsweise, mit SwingUtilities.invokeLater , threadsicher macht.
Allerdings verlangt SwingUtilities.invokeLater als Argument ein Objekt das wohl zumindestens von Runable() erbt. Ich hab mir ein paar Beispielcodes dazu angeschaut, habe allerdings immernoch keinen blassen Schimmer wie ich diese Funktion auf meinen Code anwenden soll.

Beispielsweise

Java:
// innerhalbe der while Schleife in DownloadThread.run()
 frame.setProgress((int)(totalBytes * 100L / size)); // Hier wird die Progressbar from frame updated

kann ich ja kaum unter Verwendung von SwingUtilities.invokeLater umschreiben. Da mus sich irgendwo anders ansetzen.

Der Thread wird beispielsweise so gestartet, in DownloadFrameThreaded :
Java:
downloadThread.start();

irgendwie ja zu erwarten. Probeweise habe ich probiert :

Java:
SwingUtilities.invokeLater(downloadThread);

Zwar wird die Datei dann noch downloaded, aber die ProgressBar wird nie updated.


Vielen Dank schon mal fürs Durchlesen und danke im Voraus für Antworten!

Wenn ihr noch zusätzlich mehr Code braucht, dann bitte einfach schreiben, wollte diesen Post hier nicht unnötig groß machen.

Mfg und schönen Abend noch ;)
 

xehpuk

Top Contributor
Musst du das mit Threads machen? Eigentlich verwendet man dafür [JAPI]SwingWorker[/JAPI].

a)
Am besten rufst du nur
Code:
thread.interrupt()
auf und überprüfst dort
Code:
while (!isInterrupted())
. Die Einführung einer boolean-Variable ist unnötig und bringt weitere "Probleme" mit sich (Stichwort:
Code:
volatile
).

1.
Es wirft keine Exception. Du hast wohl etwas missverstanden?

Solange der Thread nicht [JAPI]Thread#isInterrupted()[/JAPI] oder Methoden, die eine [JAPI]InterruptedException[/JAPI] werfen (wie [JAPI]Thread#sleep(long)[/JAPI]), aufruft, interessiert es ihn auch überhaupt nicht.

Kannst du selbst testen:
Java:
class InterruptTest {
	public static void main(final String... args) {
		final Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("Start.");
				for (long i = Long.MIN_VALUE; i < Long.MAX_VALUE; i++);
				System.out.println("End.");
			}
		});
		t.start();
		while (t.getState() == Thread.State.NEW);
		t.interrupt();
		System.out.println("Interrupted.");
	}
}

b)
Java:
SwingUtilities.invokeLater(new Runnable() {
	@Override
	public void run() {
		frame.setProgress((int)(totalBytes * 100L / size));
	}
});
 
Zuletzt bearbeitet:
I

invokeLater

Gast
Vielen Dank schon mal für die Antworten ;)

@Timo Ja, irgendwie fühle ich mich fast dazu verleitet.

@xehpuk

zu a) Zum Aufräumen sorgt mein Thread dazu, dass in DownloadFrameThreaded() dispose() aufgerufen wird, und es stellt sich heraus das dieses über einige calls auf einen wait() kommt. Daher scheine ich die Exception zu bekommen.
Dass dispose() aufgerufen werden soll ist festgelegt von den Vorgaben.

Ebenso, dass wir es mit Threads lösen sollen ;/

zu b) Lässt sich komplieren, der Download erfolgt auch, aber ich keine der Elemente des erzeugten DownloadFrameThreaded() lassen sich steuer. Der Button lässt sich nicht klicken und die progressBar wird nicht updated ;/
 

xehpuk

Top Contributor
a)
Ah, interessant. Du hast jedoch nicht berücksichtigt, dass der Aufruf von
Code:
dispose()
ebenso im Swing-Thread (EDT genannt) erfolgen muss.

b)
Dann führst du aber weitaus mehr als nur diese eine Zeile im EDT aus.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JDialog und SwingUtilities Java Basics - Anfänger-Themen 6
Z Threads SWING mit EventQueue.invokeLater Java Basics - Anfänger-Themen 1
V invokeLater nicht threadsafe? Java Basics - Anfänger-Themen 4
Dit_ invokeLater | richtige Anwendung Java Basics - Anfänger-Themen 2
C Interface Parameter und Rückgabewerte in Lambda Ausdrücken verwenden Java Basics - Anfänger-Themen 16
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
D next() Methode mehrfach verwenden Java Basics - Anfänger-Themen 1
N Kann man einen Iterator nur einmal verwenden Java Basics - Anfänger-Themen 5
I Scheduling: "Quartz" verwenden, Hilfe bei Umstellung Java Basics - Anfänger-Themen 3
B non-modular dependency in modularem Projekt verwenden Java Basics - Anfänger-Themen 3
A Ergebnis einer Methode bei einer anderen verwenden Java Basics - Anfänger-Themen 13
B Jar Dateien ohne IDE verwenden? Java Basics - Anfänger-Themen 1
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
A Methode in einer anderen Klasse verwenden Java Basics - Anfänger-Themen 1
V Wachstum berechnen und in Ist-Formel verwenden Java Basics - Anfänger-Themen 5
M this.object in einer parameterlosen Methode verwenden Java Basics - Anfänger-Themen 3
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
Torsten.E JavaFX mit Visual Studio Code verwenden Java Basics - Anfänger-Themen 1
S Verwenden von throw Exception an der Funktion Java Basics - Anfänger-Themen 2
K Boolean in einer erstellten Klasse verwenden Java Basics - Anfänger-Themen 14
J Methoden Methoden einer public class AutoCompleteTextField verwenden Java Basics - Anfänger-Themen 14
PaperHat Methoden als Parameter anderer Methode verwenden Java Basics - Anfänger-Themen 11
H Vererbung Static Scanner Objekt verwenden - von StdIn in einer importierten Klasse lesen Java Basics - Anfänger-Themen 10
E Sinn: final in Parameterliste verwenden Java Basics - Anfänger-Themen 2
M Klassen Warum sollte man Abstraktion verwenden? Java Basics - Anfänger-Themen 4
N Attribut einer anderen Klasse übertragen/verwenden Java Basics - Anfänger-Themen 5
M Probleme beim verwenden von Packages Java Basics - Anfänger-Themen 6
C Polymorphie Was genau ist Polymorphie und wann genau sollte man es verwenden? Java Basics - Anfänger-Themen 9
T Klassen Klasse in einer anderen Klasse verwenden. Java Basics - Anfänger-Themen 3
S Eingabe in anderer Klasse verwenden Java Basics - Anfänger-Themen 3
M Schleifenergebnis in selbiger wieder verwenden Java Basics - Anfänger-Themen 7
A OOP ArrayList verwenden Java Basics - Anfänger-Themen 3
M Erste Schritte Arraylist in einer anderen Klasse verwenden Java Basics - Anfänger-Themen 11
I BigDecimal als Parameter verwenden Java Basics - Anfänger-Themen 3
D ArrayList in einer anderen Klasse verwenden Java Basics - Anfänger-Themen 7
NightmareVirus überschriebene Methode der Oberklasse verwenden Java Basics - Anfänger-Themen 3
J Parameter in main verwenden Java Basics - Anfänger-Themen 3
M Eingabe des Benutzers Verwenden Java Basics - Anfänger-Themen 9
P Quadratzeichen verwenden Java Basics - Anfänger-Themen 7
C Variablen in Schleifen außerhalb verwenden Java Basics - Anfänger-Themen 2
H Methoden verwenden Java Basics - Anfänger-Themen 4
B Interface JTextField Eingabe als String verwenden Java Basics - Anfänger-Themen 3
OlafHD Variable aus einer anderen Klasse Verwenden Java Basics - Anfänger-Themen 11
K Dateien aus Source-Package verwenden Java Basics - Anfänger-Themen 10
N System Proxy verwenden Java Basics - Anfänger-Themen 0
J Erste Schritte Scanner negative zahl einlesen und verwenden. Java Basics - Anfänger-Themen 6
G Wie kann man den Erfolg einer Zuweisung als Boolean Wert verwenden? Java Basics - Anfänger-Themen 12
H jar datei verwenden Java Basics - Anfänger-Themen 1
J ArrayList über verschiedene Klassen verwenden Java Basics - Anfänger-Themen 7
C compareTo verwenden Java Basics - Anfänger-Themen 2
W IllegalArgumentException 2 mal verwenden Java Basics - Anfänger-Themen 3
S Variablen Vektor zur Berechnung verwenden Java Basics - Anfänger-Themen 4
L Dialogbox statt Konsole verwenden Java Basics - Anfänger-Themen 5
P JSON-Konfigurationsdatei verwenden: Probleme mit Pfad Java Basics - Anfänger-Themen 1
W Darf man den Übergabeparameter in einer Methode nicht verwenden? Java Basics - Anfänger-Themen 2
E Methode aus Klasse eins in Klasse zwei verwenden? Java Basics - Anfänger-Themen 2
E Datentypen Benutzerdefinierten Datentyp verwenden Java Basics - Anfänger-Themen 1
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
B Zahlen zerlegen und verwenden Java Basics - Anfänger-Themen 2
S Inhalt aus anderen Klassen verwenden Java Basics - Anfänger-Themen 1
I Rückgabewert einer Methode in anderer Klasse verwenden Java Basics - Anfänger-Themen 2
T Vererbung Variable aus anderer Klasse verwenden Java Basics - Anfänger-Themen 8
T File aus Classpath verwenden Java Basics - Anfänger-Themen 3
B Klassen Eigene "non static" Klasse in Main verwenden! Java Basics - Anfänger-Themen 12
T Array in andere Klasse verwenden Java Basics - Anfänger-Themen 3
K Von einem Double wert nur die Zahl vor dem Komma verwenden Java Basics - Anfänger-Themen 9
T Globale Variable mehrmals verwenden Java Basics - Anfänger-Themen 7
M Class Datein aus einen Unterordner verwenden Java Basics - Anfänger-Themen 2
B Objekt in mehereren Klassen verwenden Java Basics - Anfänger-Themen 4
L Erste Schritte Methode aus anderer Klasse verwenden Java Basics - Anfänger-Themen 16
M Wann final verwenden? Java Basics - Anfänger-Themen 5
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
G ArrayList in anderer Klasse verwenden Java Basics - Anfänger-Themen 31
D Erste Schritte Countdown mehrfach verwenden Java Basics - Anfänger-Themen 5
D Wert einer Variable in paint-Methode verwenden Java Basics - Anfänger-Themen 2
E wann welche Konstanten verwenden? Java Basics - Anfänger-Themen 7
K JTextField auslesen, in int umwandeln und in einer anderen Klasse als Zähler verwenden Java Basics - Anfänger-Themen 3
T return-Wert verwenden? Java Basics - Anfänger-Themen 12
Y this verwenden oder nicht? Java Basics - Anfänger-Themen 23
O Absolute Pfade in mehrere Klassen verwenden Java Basics - Anfänger-Themen 3
D JTextField verwenden ohne Eingabe einer Variable Java Basics - Anfänger-Themen 4
R Switch Werte außerhalb verwenden Java Basics - Anfänger-Themen 2
L Objekte aus einem void in anderen voids verwenden Java Basics - Anfänger-Themen 8
MiMa Zip in util verwenden Java Basics - Anfänger-Themen 7
P Liste in einer Klasse füllen und mehreren anderen Klassen lesend verwenden Java Basics - Anfänger-Themen 5
K Mehrere Klassen beim JavaEditor verwenden - möglich? Java Basics - Anfänger-Themen 8
K Klassen Eigene Exception verwenden Java Basics - Anfänger-Themen 9
T Verwenden von Variablen aus anderen Klassen Java Basics - Anfänger-Themen 7
S Scanner -> Zahl lesen und weiter verwenden Java Basics - Anfänger-Themen 8
SexyPenny90 JLabel Text und Icon untereinander verwenden Java Basics - Anfänger-Themen 3
J eigene packages bzw klassen verwenden Java Basics - Anfänger-Themen 25
P Date oder Kalender? Was soll man verwenden? Java Basics - Anfänger-Themen 2
K Wann Vererbung und wann Interface verwenden? Java Basics - Anfänger-Themen 12
A Wenn genau welche Liste verwenden? Java Basics - Anfänger-Themen 6
X OOP Methoden und Variablen in anderer Klasse verwenden Java Basics - Anfänger-Themen 5
P Java Stream, wann welche Stream verwenden? Java Basics - Anfänger-Themen 3
M gleiche Box in GUI mehrmals verwenden Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben