Threads Threadprogrammierung wait() und notify()

  • Themenstarter Themenstarter Gelöschtes Mitglied 34244
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 34244

Gast
Hallo zusammen,

ich bin gerade dabei eine grafische Oberfläche zu programmieren, in der nacheinander 180 Bilder angezeigt werden. Der User kann wie bei der Windows Bildanzeige durch die einzelnen Bilder durchscrollen. Um nicht alle Bilder vorher laden zu müssen habe ich einen Thread erstellt, der die Bilder im Hintergrund läd. Jetzt möchte ich aber nicht, dass automatisch alle Bilder vorgeladen werden, sondern nur die nächsten zehn bezogen auf das Bild, welches sich der User gerade anschaut. Dazu habe ich mir die Funktionen wait() und notify() angeschaut, bin mir aber nicht sicher wie ich die in meinem Fall implementieren muss. Vereinfacht läuft folgendes ab:
Vorladethread (SwingWorker-Klasse):
Java:
for([Bilderiterator]){
if(aktuelles bild in main Thread + 10 <= i){
hauptthread.setzeAktuellGeladeneBilder(i);
wait();
}
vorladeFunktionen();
}
Hauptthread (inklusive GUI):
Java:
 onButtonClick(){
		if(aktuellesBild+10 >= AktuellGeladeneBilder){
			imageIconThread.notify();
		}
}

So bekomme ich eine IllegalMonitorStateException.
Ich habe bereits herausgefunden, dass ich etwas mit synchronized machen muss, aber da ich noch nie mit Threads gearbeitet habe, weiß ich nicht genau wie ich das in meinem Fall implementieren muss. Muss ich einen weiteren Thread erstellen, der dann den Ladethread aufruft? Wenn ja, wie benachrichtige ich diesen?

Vielen Dank!
 
Zuletzt bearbeitet von einem Moderator:
Du musst auf das Objekt, an dem du wartest, synchronisiert sein.
Also:
Java:
synchronized(syncObj){
   syncObj.wait();
}

In deinem Fall verstehe ich aber nicht die Sinnhaftigkeit von wait und notify.
 
@Gucky: er will den Thread am leben halten um später weitere benutzen um neue Bilder zu laden.

Ich würde dir allerdings zu einem Threadpool der Größe 1 raten. Guck dir dazu mal die ExecutorService-API an.
 
Ich würde dem Thread eine queue geben die du nach Bedarf füllst. Dann obliegt die Logik welche Bilder geladen werden sollen dem Main-Thread.

Noch optimaler fände ich es eine Thread-Queue zu machen und für jedes Bild einen eigenen Thread zu starten.

Gruß

Claus
 
Zuletzt bearbeitet:

Zurück
Oben