Kopieren Sie den Codecode wie folgt:
öffentliche Klasse TestCyclicBarrier {
privates statisches final int THREAD_NUM = 5;
Die öffentliche statische Klasse WorkerThread implementiert Runnable{
CyclicBarrier-Barriere;
public WorkerThread(CyclicBarrier b){
this.barrier = b;
}
@Override
public void run() {
// TODO Automatisch generierter Methoden-Stub
versuchen{
System.out.println("Arbeiter wartet");
//Threads warten hier, bis alle Threads die Barriere erreichen.
barrier.await();
System.out.println("ID:"+Thread.currentThread().getId()+" Working");
}catch(Ausnahme e){
e.printStackTrace();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Automatisch generierter Methoden-Stub
CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
//Wird ausgeführt, wenn alle Threads die Barriere erreichen
@Override
public void run() {
// TODO Automatisch generierter Methoden-Stub
System.out.println("Inside Barrier");
}
});
for(int i=0;i<THREAD_NUM;i++){
neuer Thread(new WorkerThread(cb)).start();
}
}
}
/*
Hier ist die Ausgabe:
Arbeiter wartet
Arbeiter wartet
Arbeiter wartet
Arbeiter wartet
Arbeiter wartet
Innerhalb der Barriere
ID:12 Funktioniert
ID:8 Funktioniert
ID:11 Funktioniert
ID:9 Funktioniert
ID:10 Funktioniert
*/
1. Geben Sie bei der Initialisierung von CyclicBarrier eine Zahl an und berechnen Sie dann die Anzahl der Threads, die CyclicBarrier.await() zum Warten aufrufen. Wenn die Anzahl der Threads diese Zahl erreicht, werden alle Threads, die in den Wartezustand eingetreten sind, aufgeweckt und fahren fort.
2. CyclicBarrier kann, wie der Name schon sagt, als Hindernis betrachtet werden. Alle Threads müssen vorhanden sein, bevor sie dieses Hindernis gemeinsam überwinden können.
3. CyclicBarrier kann zunächst auch einen Runnable-Parameter annehmen. Diese Runnable-Aufgabe wird ausgeführt, nachdem die Anzahl der CyclicBarriers erreicht ist und bevor alle anderen Threads aktiviert werden.