Threading & GUI

A

Aaaalex

Gast
Hey ho ich bin vor knapp nem Monat auf Java umgestiegen und versuche mich gerade am MultiThreading.
Mich hat sehr überrascht, dass man in anscheinent keine einzelne Funktion in einem Thread ausführen kann, so wie es in anderen Sprachen (c/c++,delpi,basics) der fall ist.
Ich schreibe gerade eine Bot-Klasse für eine Online Community. Die Klasse sucht viele Profile der Community und besucht sie alle.
Das ganze geht durch mehrere schleifen und der komplette Besuchvorgang kann schonmal 2 Stunden dauern. Nun habe ich angefangen mit eine GUI dazu zu basteln. Sie soll dem Benutzer Informationen geben:
-Wie lange läuft der Besuchvorgang schon,
-wie lange läuft we noch,
-welches profil wird gerade besucht
und einiges mehr.

Da ist es logisch, dass die GUI hängenbleibt, wenn ich im button-click event eine Schleife aufrufe, die ~2 Stunden durchlaufen wird.
In einer anderen Sprache würde ich die Funktion zum Besuchen der Profile einfach in einem Thread aufrufen:
vb.net
dim t as new System.Threadint.Thread(AdressOf xyz.besucheProfile())
t.start()
In Java ist das leider nicht möglich.
Kann mir jemand sagen, wie ich das Problem lösen könnte ?
Mfg Alex.
 

eRaaaa

Top Contributor
In Java ist das leider nicht möglich.

Und das sagt wer? Dass das so 1:1 nicht geht, sollte klar sein, aber du kannst ein Runnable dem Thread übergeben und in dessen run-Methode dann deine Methoden aufrufen. Alle Änderungen die du dann wieder an der GUI machst müssen dann allerdings wieder in die Warteschlange des GUI-Threads eingereiht werden. Oder man nimmt direkt den SwingWorker:
Lesson: Concurrency in Swing (The Java™ Tutorials > Creating a GUI With JFC/Swing)

Gehts überhaupt um Swing? :)
 
A

Aaaalex

Gast
"aber du kannst ein Runnable dem Thread übergeben und in dessen run-Methode dann deine Methoden aufrufen."

nun hat meine klasse aber mehrere methoden, welche in einem thread aufgerufen werden sollten, zB
-UserSuchen(int minAlter,int maxAlter, String Geschlecht, boolean online)
-KompletteUserlisteBesuchen(int WarteZeitinSekunden) //dauert sehr lange

In der Run-Methode kann ich ja dann jeweils nur eine Funktion ausführen.

Ich glaube der ganze vb.net scheiss hat mir nen echt dreckigen Programmierstiel eingebrannt, ist wirklich schlimm, merkt man erst im nachhinein.
 

obscuri

Mitglied
Aber du kannst doch aus der run-Methode wieder andere Methoden aufrufen...

also

public void run(){
userSuchen(...);
...
}

usw.

Musst dann eventuell synchronisieren und auf Thread-Sicherheit achten.
 
A

Aaaalex

Gast
dann müsste ich ja für jede funktion eine neue klasse schreiben, das scheint auch nicht sehr effektiv.
 
A

Aaaalex

Gast
okay, ich habe jetzt eine methode gefunden, wusste nicht, dass es so einfach ist.
Thread t = new Thread(){
public void run(){
//meinen code
}
}

ich dachte ich müsste für jede funktion eine neue klasse schreiben und diese von der threadklasse erben lassen.
Danke nochmal für eure hilfe =)
 

eRaaaa

Top Contributor
okay, ich habe jetzt eine methode gefunden, wusste nicht, dass es so einfach ist.
Thread t = new Thread(){
public void run(){
//meinen code
}
}

ich dachte ich müsste für jede funktion eine neue klasse schreiben und diese von der threadklasse erben lassen.
Danke nochmal für eure hilfe =)

Naja das war ja das was ich oben meinte. Was du jetzt hier allerdings machst ist ja, dass du eine Unterklasse (anonyme innere Klasse) von Thread erstellst und einfach die run-Methode überschreibst. Ich hatte eher an so etwas wie
Java:
		Thread t = new Thread(new Runnable() {
			public void run() {
				// meinen code
			}
		});
gedacht oder eben nur so etwas wie new Thread(new MyRunnable()); Durch das Runnable bist du normal flexibler!
 

Ähnliche Java Themen

Neue Themen


Oben