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.
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.
Übergeben Sie eine Runnable
-Instanz so an den Konstruktor von CyclicBarrier
.
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
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)
Tags und Links java multithreading concurrency cyclicbarrier