Warten bis Thread an einem Semaphore angekommen ist

Status
Nicht offen für weitere Antworten.
Hallo,

ich bin zwar kein Java-Neuling, bräuchte aber dennoch etwas Unterstützung für mein Problem:

Ich möchte in meinem Programm einen Thread so lange anhalten, bis ein anderer an einem Semaphore angekommen ist. Der Code dazu sieht ungefähr folgendermaßen aus:

Java:
public static void main(String[] args) throws Exception
{
    final Semaphore s = new Semaphore(0);
    Thread t = new Thread(new Runnable()
    {
        public void run()
        {
             // dies soll der Punkt sein, an dem der Thread "fertig" ist
             s.tryAcquire();
                        
             // ...Programmlogik
        }
    });
    t.start();
	
    // dieses Konstrukt ist sehr unschön, wie geht das besser?
    while(!s.hasQueuedThreads())
    {
        Thread.sleep(1);
    }
}

Gerne würde ich Konstrukt mit dem Thread.Sleep(1) irgendwie besser hinkriegen, denn der wartende Thread soll "schnellstmöglich" weiterlaufen, sobald der andere Thread am Semaphore angekommen ist. Nur wir schafft man das ohne "busy waiting"?

Ich habe mir auch schon überlegt, den Hauptthread auf einem weiteren Semaphore warten zu lassen, den der andere Thread vor Erreichen der eigentlichen Semaphores setzt. Nur dann ist immer noch nicht 100% sicher, dass der gestartete Thread tatsächlich am Semaphore steht.

Freue mich über interessante Antworten! :)

Viele Grüße,
Markus
 
Hallo,

erstmal Danke für die schnelle Antwort. Ich habe mir das Kapitel nochmal etwas genauer durchgesehen, aber für mein Szenario nicht das passende gefunden. Hast du vielleicht noch einen kleinen Hinweis, welches Synchronisationsobjekt das Richtige für mich sein könnte?

Mir ist klar, dass ich in irgendeiner Weise aus dem gestarteten Thread dem anderen mitteilen muss, dass der Thread nun "bereit" ist. Mach ich das z.B. über einen Semaphore, ist das aber nicht 100% das, was ich eigentlich will, weil ich immer noch nicht konkret an der Stelle bin, an der ich eigentlich sein will. Mein angedachter Code sähe folgendermaßen aus:

Java:
public static void main(String[] args) throws Exception
{
    final Semaphore s = new Semaphore(0);
    final Semaphore startSemaphore = new Semaphore(0);
    Thread t = new Thread(new Runnable()
    {
        public void run()
        {
             // dem Hauptthread mitteilen, dass wir nun "so gut wie fertig" sind
             startSemaphore.release();

             // dies soll der Punkt sein, an dem der Thread "fertig" ist
             try
             {
               s.acquire();
             }
             catch(Exception ex)
             {}
                   
             // ...Programmlogik
        }
    });
    t.start();
    
    // warten bis der neu gestartete Thread an seiner definierten Stelle ist (s.acquire())
    startSemaphore.acquire();

    // liefert das wirklich immer true?
    System.out.println("Neuer Thread fertig: "+s.hasQueuedThreads());
}

Das Problem das ich hier sehe ist, dass nach dem Setzen des "startSemaphore.release()" aus dem neuen Thread der Hauptthread das acquire bekommt und nun das System.out.println "false" ausgeben könnte. Das passiert genau dann, wenn durch das Thread-Sheduling nach dem "release"-Aufruf direkt der Haupthread weiterläuft, ohne dass der gestartete Thread noch weiter Rechenzeit bekommt.

Ich hoffe ich kann zumindest einigermaßen erklären, was mein Problem ist! ;) Manchmal ist es gar nicht so einfach, "genau" zu beschreiben, welches Problem man sieht/hat...

Grüße,
Markus
 
S

SlaterB

Gast
auf das Thread-Sheduling kannst du eh keinen Einfluss nehmen, davon sollte nichts in deinem Programm abhängen,
ansonsten unabhängig vom Semaphor:

der Hauptthread wartet an irgendeinem Monitor: wait(), der Thread t benachrichtigt den Hauptthread, wenn es soweit ist: notify()

wait()/ notify() sind im Buch erklärt bzw. andere modernere Mechanismen
11.6.3 Warten mit wait() und Aufwecken mit notify() Zur nächsten ÜberschriftZur vorigen Überschrift

Nachdem im vorigen Abschnitt der Weg mit den Java-5-Klassen und -Schnittstellen beschritten wurde, wollen wir uns abschließend mit den Möglichkeiten beschäftigen, die Java seit der Version 1.0 mitbringt.
[..]
 
Hm,

das habe ich soweit verstanden.

Ich denke ich werde es mit dem wait/notify umsetzen (bzw. mit der doppelten Semaphor-Lösung aus meinem zweiten Post), und im dem Hauptthread nach dem wait noch eine Schleife einbauen die blockiert bis der andere Thread tatsächlich im Semaphor steht. Das busy-waiting wird somit stark verkürzt.

Vielen Dank! :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Thread auf anderen warten Java Basics - Anfänger-Themen 2
R Thread soll auf andere Threads warten Java Basics - Anfänger-Themen 3
S Thread warten abbrechen? Java Basics - Anfänger-Themen 5
G Thread soll warten Java Basics - Anfänger-Themen 5
S Thread auf Thread warten lassen. Java Basics - Anfänger-Themen 2
B Timer / Thread warten Java Basics - Anfänger-Themen 3
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
E Richtiges Warten Java Basics - Anfänger-Themen 8
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
G Wie kann ich 1s lang warten? Java Basics - Anfänger-Themen 1
D JFrame - 10 Sekunden bis zum schließen warten. Java Basics - Anfänger-Themen 2
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
C Warten auf Antwort Java Basics - Anfänger-Themen 22
S Threads Programm terminiert statt zu warten Java Basics - Anfänger-Themen 20
E ExecutorService warten bis alles fertig? Java Basics - Anfänger-Themen 5
A Threads Eine Klasse muss auf Variable der Anderen warten. Java Basics - Anfänger-Themen 6
D Input/Output Auf Tasteneingabe warten Java Basics - Anfänger-Themen 4
A Activity1 soll auf Activity2 warten (Camera-Intent) Java Basics - Anfänger-Themen 5
D Threads Kartenspiel - auf legen warten Java Basics - Anfänger-Themen 15
B Methode warten lassen bis Button gedrückt wird Java Basics - Anfänger-Themen 16
JAVAnnik auf Threadende warten Java Basics - Anfänger-Themen 6
H Auf Threads warten Java Basics - Anfänger-Themen 3
S Warten bis alle Threads fertig sind Java Basics - Anfänger-Themen 12
I Auf DB-Operation warten Java Basics - Anfänger-Themen 2
T Warteschlange warten lassen bis Ereignis Java Basics - Anfänger-Themen 27
A Main warten lassen bis Variable durch Button übergeben wird Java Basics - Anfänger-Themen 2
V Warten bis die Länge eines Strings nicht mehr 0 ist Java Basics - Anfänger-Themen 13
M prozess starten und warten bis dieser sich beendet Java Basics - Anfänger-Themen 3
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
D Auf Event warten Java Basics - Anfänger-Themen 4
F Logikproblem: Auf Mouselistener warten Java Basics - Anfänger-Themen 6
E Auf Mouselistener warten?! Java Basics - Anfänger-Themen 20
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
S Auf andere Methode warten Java Basics - Anfänger-Themen 7
B Während Schleife nicht auf Eingabe warten Java Basics - Anfänger-Themen 2
T auf vbscript warten Java Basics - Anfänger-Themen 3
C auf beendigung eines threads warten Java Basics - Anfänger-Themen 6
P Warten auf KeyTyped Java Basics - Anfänger-Themen 7
M warten in einer while-schleife Java Basics - Anfänger-Themen 12
L programm zum warten zwingen Java Basics - Anfänger-Themen 4
B Auf Programm warten Java Basics - Anfänger-Themen 2
S Auf Object warten Java Basics - Anfänger-Themen 2
K Auf File- Befehl warten. Java Basics - Anfänger-Themen 10
T eine Sekunde warten Java Basics - Anfänger-Themen 11
C Konsolenanwendung auf belibige Taste warten Java Basics - Anfänger-Themen 2
D Auf anderes Fenster Warten Java Basics - Anfänger-Themen 6
A Warten auf Userinput Java Basics - Anfänger-Themen 2
G Bei JDialog warten Java Basics - Anfänger-Themen 5
T Auf Selection warten Java Basics - Anfänger-Themen 7
N Java Insel 6 lesen oder auf 7 warten ? Java Basics - Anfänger-Themen 11
S Programmablauf pausieren, bzw. auf Eingabe warten Java Basics - Anfänger-Themen 4
G Warten auf Eingabe Java Basics - Anfänger-Themen 12
F 1 Minute warten Java Basics - Anfänger-Themen 18
G auf ende mehrerer threads warten Java Basics - Anfänger-Themen 2
G warten Java Basics - Anfänger-Themen 10
P Warten-Fenster Java Basics - Anfänger-Themen 8
vogella *Gelöst *Im Programm warten (wait()) Java Basics - Anfänger-Themen 2
A Bitte Warten Java Basics - Anfänger-Themen 2
P Externen Proceß starten und warten bis beendet? Java Basics - Anfänger-Themen 2
J Threads: warten bis erste aktion ausgeführt wurde Java Basics - Anfänger-Themen 6
G Eine Methode zum Warten? Java Basics - Anfänger-Themen 7
G Frage zum Warten auf und Aufwecken von Threads Java Basics - Anfänger-Themen 2
L Einfaches Warten in eine Schleife Java Basics - Anfänger-Themen 9
B auf mehrere Threads warten Java Basics - Anfänger-Themen 3
K Animation warten lassen Java Basics - Anfänger-Themen 9
S Auf JInternalFrame warten? Java Basics - Anfänger-Themen 2
R Warten, bis ein Prozess gestartet wurde Java Basics - Anfänger-Themen 23
M x Sekunden warten Java Basics - Anfänger-Themen 13
P Bitte um ein paar Tipps! (Threads, Warten auf Ereignisse,.) Java Basics - Anfänger-Themen 2
M Wie lässt man eine Methode warten ohne Threads zu benutzen? Java Basics - Anfänger-Themen 8
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0

Ähnliche Java Themen

Neue Themen


Oben