# Auf Thread warten



## milanwb (19. Okt 2008)

Wenn man mit Swing arbeitet benötigt man ja Threads um die GUI aktualisierbar/benutzbar zu halten.
Nun habe ich ein Programm, welches über eine URL (eine PHP Datei) Daten in eine Datenbank schreibt.

Anschließend soll das Programm den Datenbestand über eine andere PHP Datei erneut auslesen.


Mein Problem besteht nun darin, dass der Schreibvorgang manchmal etwas länger dauert und dann hat das Programm bereits den Lesevorgang wieder beendet.
Natürlich fehlen nun die Daten aus dem Schreibvorgang.


Zur Zeit habe ich 2 Threads, die die Vorgänge meistern. 
Im Guibereich habe ich das Problem jetzt so gelöst: (Was natürlich keine Lösung ist, weil ich mit Thread.sleep ja genauso das GUI lahmlege)



```
// Klasse GUI...

public void schreibe() {

try {

new SchreibeThread(this).start();

Thread.sleep(500) // Dies funktioniert natürlich nur, wenn der Datenaustausch <0,5 sek dauert

new LeseThread(this).start();



} catch (Exception e) {}

}
```


Damit ist ja die Bedienung des Guis auch nicht möglich (man hätte sich die Threads also sparen können)


Nun meine Frage gibt es eine Möglichkeit auf den SchreibeThread zu warten, ohne dass das GUI zu leiden hat?

Als Lösung hab ich mir Gedacht, setze den kompletten Code hinter SchreibeThread in eine Methode, die dann von diesem ausgelöst wird.
Hier hab ich aber wieder das Problem, dass mein SchreibeThread auch in anderen Bereichen Anwendung findet, wonach ganz andere Aktionen ausgeführt werden sollen.
Ich müsste dann eine lange Switch-Case Abfrage durchführen, damit der Thread weiß, was er noch tun soll. Das fänd ich sehr mühevoll und unschön.

Wenn es natürlich keine andere Möglichkeit gibt, dann muss ich wohl in den sauren Apfel beißen 
Aber vielleicht gibt es etwas wie 

Thread.waitFor, die das Gui nicht leiden lässt!



Viele Dank für eure Tipps

Michael


----------



## FArt (19. Okt 2008)

lange Rede, kurzes Tutorial:
http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html


----------



## Gast2 (19. Okt 2008)

Moin,



			
				milanwb hat gesagt.:
			
		

> Wenn man mit Swing arbeitet benötigt man ja Threads um die GUI aktualisierbar/benutzbar zu halten.


nein ... das Problem hast Du unter nativen Windows auch ... ist kein Swing-Problem ... daher die GUI im Hauptthread lassen und alle längeren Aktionen in einen Nebenthread auslagern



> Nun habe ich ein Programm, welches über eine URL (eine PHP Datei) Daten in eine Datenbank schreibt.
> Anschließend soll das Programm den Datenbestand über eine andere PHP Datei erneut auslesen.




```
new SchreibeThread(this).start();
Thread.sleep(500) // Dies funktioniert natürlich nur, wenn der Datenaustausch <0,5 sek dauert
new LeseThread(this).start();
```

wenn Thread B _*immer*_ nach Thread A ausgeführt werden soll ... dann hast Du eine serielles Problem ... das kannst Du nicht mit (pseudo) paralleler Abarbeitung lösen


```
new MacheWasThread(this).start()
```


```
public void Runnable() { DatenSchreiben(); DatenLesen(); }
```

mache einen Thread aus beiden Problemen und lass sie seriell abarbeiten

hand, mogel


----------



## milanwb (19. Okt 2008)

Ich glaube du hast recht mogel 

Das wäre eigentlich die beste Möglichkeit.
Ich hab dann zwar mehrere Klassen, aber ich kann ja auch eine Sammelklasse mit den unterschiedlichen Methoden (schreiben Variante 1..2..3/ lesen) basteln, die ich dann über


```
public void schreibe () {


FuntkionenSammelKlasse fsk = new FuntkionenSammelKlasse ();

Thread t = new Thread(new Runnable() {

fsk.schreibe();
fsk.lese();


});

t.start(); 

}
```

in einen Thread bringe, oder?


Was haltet ihr von der Lösung?




@FArt

SwingWorker klingt gut! Werd ich mir auch mal zu gemüte ziehen!

Danke für die Lösungen


----------



## gast (19. Okt 2008)

Du könntest Dir auch mal die java-api  zu gemüte ziehen. Vielleicht kommst Du ja bis thread.join().


----------



## milanwb (19. Okt 2008)

Nur .join legt ja wieder das GUI lahm!
Das wäre eine gute Lösung um das sleep(); zu verbesser!


----------

