Copiez le code comme suit :
classe publique TestCyclicBarrier {
privé statique final int THREAD_NUM = 5 ;
la classe statique publique WorkerThread implémente Runnable{
Barrière CyclicBarrier ;
public WorkerThread (CyclicBarrier b) {
this.barrier = b;
}
@Outrepasser
public void run() {
// TODO Stub de méthode généré automatiquement
essayer{
System.out.println("Travailleur en attente");
//Les threads attendent ici jusqu'à ce que tous les threads atteignent la barrière.
barrière.attendre();
System.out.println("ID:"+Thread.currentThread().getId()+" Working");
}attraper(Exception e){
e.printStackTrace();
}
}
}
/**
* @param arguments
*/
public static void main (String[] arguments) {
// TODO Stub de méthode généré automatiquement
CyclicBarrier cb = nouveau CyclicBarrier (THREAD_NUM, nouveau Runnable() {
//Exécuté lorsque tous les threads atteignent la barrière
@Outrepasser
public void run() {
// TODO Stub de méthode généré automatiquement
System.out.println("À l'intérieur de la barrière");
}
});
pour(int i=0;i<THREAD_NUM;i++){
nouveau Thread(nouveau WorkerThread(cb)).start();
}
}
}
/*
Voici le résultat :
L'ouvrier attend
L'ouvrier attend
L'ouvrier attend
L'ouvrier attend
L'ouvrier attend
Barrière intérieure
ID : 12 En cours
ID : 8 En état de marche
ID : 11 En cours
ID : 9 En état de marche
ID : 10 En cours
*/
1. Spécifiez un nombre lorsque CyclicBarrier est initialisé, puis calculez le nombre de threads qui appellent CyclicBarrier.await() pour attendre. Lorsque le nombre de threads atteint ce nombre, tous les threads entrés en état d'attente sont réveillés et continuent.
2. CyclicBarrier, comme son nom l'indique, peut être considéré comme un obstacle. Tous les threads doivent être présents avant de pouvoir franchir cet obstacle ensemble.
3. CyclicBarrier peut également prendre un paramètre Runnable initialement. Cette tâche Runnable sera exécutée une fois le nombre de CyclicBarriers atteint et avant que tous les autres threads ne soient réveillés.