Wie bekomme ich die java.concurrency.CyclicBarrier wie erwartet zu arbeiten

7

Ich schreibe Code, der zwei Threads erzeugt und dann darauf wartet, dass sie mit der CyclicBarrier-Klasse synchronisiert werden. Problem ist, dass die zyklische Barriere nicht wie erwartet funktioniert und der Haupt-Thread nicht darauf wartet, dass die einzelnen Threads enden. So sieht mein Code aus:

%Vor%

Irgendeine Idee, was ich falsch mache? Oder gibt es eine bessere Möglichkeit, diese Barrieresynchronisationsmethoden zu schreiben? Bitte helfen Sie.

    
Ritesh M Nayak 26.03.2010, 09:38
quelle

4 Antworten

14

Während der Ausführung Ihres Haupt-Threads erstellen Sie zwei weitere Threads und sagen ihnen, dass sie auf einander warten sollen. Aber du hast nichts geschrieben, damit dein Haupt-Thread auf sie wartet und sich beschweren, dass es nicht wartet. Probieren Sie

aus %Vor%

Übrigens. Erweitern Sie nicht die Thread-Klasse, es sei denn, Sie müssen. Implementieren Sie Runnable und übergeben Sie Implementierungen an Thread-Objekte. So:

%Vor%

BEARBEITEN
Begründung für die Vermeidung von Gewindeverlängerungen.
Die Faustregel ist so wenig Kopplung wie möglich. Vererbung ist eine sehr starke Verbindung zwischen Klassen. Sie müssen von Thread erben, wenn Sie das Standardverhalten ändern (d. H. Einige Methoden überschreiben) oder auf geschützte Felder der Klasse Thread zugreifen möchten. Wenn Sie es nicht möchten, wählen Sie looser coupling - Implementieren von Runnable und Übergabe als Konstruktorparameter an die Thread-Instanz.

    
Tadeusz Kopec 26.03.2010, 10:58
quelle
2

Übergeben Sie eine Runnable -Instanz so an den Konstruktor von CyclicBarrier .

%Vor%     
Chandra Sekar S 26.03.2010 09:47
quelle
2

Sie suchen Thread.join () Methode ...

%Vor%

BEARBEITEN: wegen der Kommentare ...

Und wenn Sie nicht ewig warten möchten, können Sie auch die maximale Anzahl von Millisekunden plus Nanosekunden angeben, die auf das Absterben des Threads warten sollen

    
pgras 26.03.2010 10:05
quelle
1

Die zyklische Barriere ist in diesem Fall nicht die richtige Wahl. Sie müssen CountDownLatch hier verwenden.

Ich nehme an, Sie haben spawnAndWait Methode von der Hauptmethode aufgerufen.

Der Grund, warum dies nicht funktioniert, ist, dass das CyclicBarrier 2 Konstruktoren hat. Um Nachoperationen auszuführen, müssen Sie einen Konstruktor mit zwei Parametern verwenden. Das Wichtigste, an das Sie sich erinnern sollten, ist, dass der Haupt-Thread nicht auf die Methode await wartet. aber wird weiter ausgeführt werden. Der Thread, der im CyclicBarrier -Konstruktor angegeben ist, wird jedoch nur ausgeführt, wenn alle erzeugten Threads an der Barriere anhalten (durch die await -Methode)

    
roy2601 20.09.2011 07:38
quelle