Zäune ähneln Schlössern, sind aber unterschiedlich.
1. Sperren werden zum Warten auf Ereignisse verwendet, während Zäune zum Warten auf andere Threads verwendet werden. Das heißt, das Ereignis, auf das Sperren gewartet werden, ist das CountDown-Ereignis Alle zuvor wartenden Threads können weiterhin ausgeführt werden. Der Zaun verfügt nicht über ein ähnliches countDown-Ereignis, um die Ausführung des Threads zu steuern. Nur die Wartemethode des Threads kann die Ausführung des wartenden Threads steuern.
2. CyclicBarrier betont n Threads. Jeder wartet auf den anderen.
Szenarioanalyse: 10 Personen machen einen Frühlingsausflug und es wird festgelegt, dass sie nach Erreichen eines bestimmten Ortes weitermachen können. Der Code lautet wie folgt:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
Klasse CyclicBarrierWorker implementiert Runnable {
private int-id;
private CyclicBarrier-Barriere;
public CyclicBarrierWorker(int id, final CyclicBarrier barrier) {
this.id = id;
this.barrier = Barriere;
}
@Override
public void run() {
// TODO Automatisch generierter Methoden-Stub
versuchen {
System.out.println(id + " die Leute warten");
barrier.await(); // Jeder wartet auf das Eintreffen des letzten Threads
} Catch (InterruptedException | BrokenBarrierException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
}
}
öffentliche Klasse TestCyclicBarrier {
public static void main(String[] args) {
int num = 10;
CyclicBarrier barrier = new CyclicBarrier(num, new Runnable() {
@Override
public void run() {
// TODO Automatisch generierter Methoden-Stub
System.out.println("Gemeinsam weitermachen!");
}
});
for (int i = 1; i <= num; i++) {
neuer Thread(neuer CyclicBarrierWorker(i, Barriere)).start();
}
}
}
Der ausgegebene Kopiercode lautet wie folgt:
Die ersten Leute warten
2. Leute warten
Der Dritte wartet
4. Leute warten
5. Leute warten
7. Leute warten
8. Leute warten
6. Leute warten
9. Leute warten
10. Leute warten
macht gemeinsam weiter!