synchronized und notify / notifyAll

Status
Nicht offen für weitere Antworten.

kaesebrot

Mitglied
Hi,

hab auf die schnelle keine Antwort auf folgende Frage finden können:

* Thread1 und Thread2 haben jeweils einen synchronized Block mit Object X.
* Thread2 betritt regelmäßig den Block und führt eine aufwändigere Operation durch

Wie kann ich sicherstellen, daß Thread1 garantiert drankommt, wenn Thread2 den Block verläßt? Ich bin mir nicht sicher, ob ich das gewünschte Verhalten mit X.notifyAll() erzielen kann. In der Doku steht, daß nur Threads die mittels wait() auf X warten "aufgeweckt" werden. Also ist der Ansatz warscheinlich falsch.

Rahmenbedingungen:
* Thread1 soll auch ohne Zutun von Thread2 arbeiten können
* Thread2 kennt Thread1 nicht



viele Grüße,
Käse
 

kaesebrot

Mitglied
soll es denn IMMER alternierend geschehen? also immer T1 -> T2 -> T1 -> T2 etc
Nein soll es nicht. Ich konkretisiere das Problem am besten mal ein wenig:

Es geht um einen Server der viele Clients bedienen soll. Der Server führt eine Liste der angemeldeten Clients. Thread1 ist dafür zuständig die An- und Abmeldung der Clients zu registrieren und die Liste entsprechend aktuell zu halten. Die Liste wird hier also nur kurz benötigt.
Thread2 wird beim versenden einer Broadcast-Nachricht zuständig. Thread2 geht hierzu die Liste der angemeldeten Clients durch und schreibt die Daten jeweils in einen sende-Buffer. Das dauert im Vergleich zu Thread1 ziemlich lang.

Problematik: Werden viele Daten versendet, hat Thread2 viel zu tun. Ich habe die Befürchtung das in einem solchen Fall Thread1 verhungern kann (siehe: http://java.sun.com/docs/books/tutorial/essential/concurrency/starvelive.html).

Diesem Verhungern möchte ich vorbeugen, indem ich den Threads, die gerade wg. synchronized(ListeDerAngemeldetenClients) blockiert sind das Zepter übergebe bevor ich wieder anfange was zu versenden.


Eine Lösung wäre, daß sich Thread1 irgendwo einträgt bevor es wartet und von Thread2 aktiviert wird. Gibt es eine schönere Lösung bzw. ist dies überhaupt eine sinnvolle Lösung?



viele Grüße,
Käse
 

André Uhres

Top Contributor
kaesebrot hat gesagt.:
Wie kann ich sicherstellen, daß Thread1 garantiert drankommt, wenn Thread2 den Block verläßt?
Version 1.5 von Java und sein Paket java.util.concurrent (sowie seine Unterpakete) liefern
Synchronisationswerkzeuge von höherem Niveau.

Ein sehr nützliches Werkzeug ist Executor. Es handelt sich um eine blockierende Warteliste
von durchzuführenden Aktionen. Man findet genau denselben Mechanismus wieder,
wenn man den Thread benutzt, welcher der graphischen Anzeige von Swing gewidmet ist (Event Dispatch Thread):
SwingUtilities.invokeLater(Runnable) stellt eine Aktion in die Warteschlange, die in dem Thread durchzuführen ist,
welcher der graphischen Anzeige gewidmet ist.

Hier ist ein Beispiel der Benutzung von Executor:
Code:
Executor executor = Executors.newSingleThreadExecutor () ;
executor.execute ( new  Runnable () {
     public  void  run () {
         System.out.println ( "asynchroner Aufruf 1" ) ;
     }
}) ;
executor.execute ( new  Runnable () {
     public  void  run () {
         System.out.println ( "asynchroner Aufruf 2" ) ;
     }
}) ;
Dieses Beispiel führt Runnables asynchron gegenüber dem laufenden Thread aus, aber gewährleistet,
dass sie in der Aufrufreihenfolge nacheinander durchgeführt werden.
 
G

Gelöschtes Mitglied 5909

Gast
ich bin jetzt nicht grad der multi threading experte, aber du könntest mit einer höheren priorität (MAX_PRIOTIRY) versuchen zu verhindern dass der thread verhungert, das ganze ist ja eigentlich für genau diesen fall gemacht wenn ich mich nicht täusch
 

kaesebrot

Mitglied
Hi,

das Problem könnte eventuell damit in den Griff bekommen werden, jedoch möchte ich, daß alle Threads mit gleicher Priorität behandelt werden.


viele Grüße,
Käse
 

didjitalist

Bekanntes Mitglied
Dein Thread1 übernimmt eine Aufräumarbeit, die Thread2 unmittelbar entlasten kann. Daher erscheint es mir sinnvoller, das durch einen einzigen Thread zu lösen. Oder anders gesagt, die Aktion, die entscheiden kann, welche Clients noch mit dem Server verbunden sind, sollte auch vollständige Kontrolle über die Aktion haben, die Daten versendet.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Synchronized Probleme Allgemeine Java-Themen 7
D ReentrantLock oder Synchronized ? Allgemeine Java-Themen 3
B Threads synchronized Allgemeine Java-Themen 3
OnDemand Threads und synchronized Allgemeine Java-Themen 9
N Best Practice Semi-Synchronized Zugriff Allgemeine Java-Themen 0
E Verständnisfrage zu synchronized-Blöcken Allgemeine Java-Themen 3
J yield() Aufruf in einer synchronized-Methode Allgemeine Java-Themen 13
A Frage zu Synchronized Allgemeine Java-Themen 5
R Synchronized - auf welchem Objekt Allgemeine Java-Themen 16
R synchronized methode rekursiv aufrufen Allgemeine Java-Themen 5
P synchronized Allgemeine Java-Themen 4
S komplexe synchronized bedingungen Allgemeine Java-Themen 6
G synchronized Allgemeine Java-Themen 7
J Threads und synchronized Allgemeine Java-Themen 18
hdi synchronized & volatile Allgemeine Java-Themen 10
G zwei mal synchronized Allgemeine Java-Themen 5
J synchronized block mit this und wait() Allgemeine Java-Themen 5
M Verständnis "synchronized" Allgemeine Java-Themen 4
T Thread synchronized Allgemeine Java-Themen 5
Kr0e Synchronized Allgemeine Java-Themen 4
G synchronized-Sclüsselwort: welche Reihenfolge zum Betreten? Allgemeine Java-Themen 6
R synchronized "gegen sich selbst" Allgemeine Java-Themen 5
R ConcurrentModificationException trotz synchronized? Allgemeine Java-Themen 12
R Thread-Problem, und synchronized bringt nix Allgemeine Java-Themen 4
J synchronized (bitte beantworten, urgent! danke) Allgemeine Java-Themen 11
H Ein synchronized Block ausreichend? Allgemeine Java-Themen 6
G synchronized Klasse? Allgemeine Java-Themen 6
G synchronized + threads Allgemeine Java-Themen 12
A deadlocks bei synchronized Allgemeine Java-Themen 3
K vector, synchronized und mehrere methoden Allgemeine Java-Themen 3
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
G Threads Threadprogrammierung wait() und notify() Allgemeine Java-Themen 4
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
B Threads Barrier mit wait()/notify() aber nicht alle Prozesse terminieren Allgemeine Java-Themen 2
P Threads abwechseln lassen mit wait() und notify() Allgemeine Java-Themen 2
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
K Threads wait() und notify() Allgemeine Java-Themen 8
B notify() - was passiert danach genau? Allgemeine Java-Themen 8
Q Frage zu Threads ( notify() wait() ) Allgemeine Java-Themen 6
G Thread wait, notify Allgemeine Java-Themen 4
L Producer/Consumer Thread mit notify auf File Allgemeine Java-Themen 5
G notify() was wird verständigt Allgemeine Java-Themen 5
H wait() and notify() mit mehreren Prozessen Allgemeine Java-Themen 14
G MVC-Konzept - effizienz beim "notify" Allgemeine Java-Themen 2
A thread1 stoppt thread2 mit wait() und notify() ? Allgemeine Java-Themen 3
M Unterschied notify() und notifyAll() Allgemeine Java-Themen 1
S Unterschied zwischen notify() und notifyAll() Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben