Кода -копия выглядит следующим образом:
пакет com.yao;
импортировать java.util.random;
Импорт java.util.concurrent.cyclicbarrier;
/**
* Cyclicbarrier похож на Countdownlatch, и это также счетчик.
* Разница в том, что количество циклического каррирчика называется cyclicbarrier.await (), чтобы войти в номер ожидания.
* Когда количество потоков достигает числа, указанного в начальное время циклического каррир, все потоки, попадающие в состояние ожидания, пробуждаются и продолжаются.
* Cyclicbarrier, как и его название, можно рассматривать как препятствие.
* Все потоки должны быть прибыли, прежде чем они смогут передать это препятствие вместе.
* Cyclicbarrier также может иметь запускаемый параметр в начале.
* После того, как количество достигнутости циклического карринка все остальные потоки выполняются до того, как они будут пробуждены.
*/
открытый класс cyclicbarriertest {
Public Static Class ComponentThread реализует Runnable {
Cyclicbarrier Barrier; // счетчик
int id; // идентификатор компонента
int [] array; // массив данных
// построить метод
public ComponentThread (Cyclicbarrier Barrier, int [] Array, int id) {
this.barrier = барьер;
this.id = id;
this.array = массив;
}
public void run () {
пытаться {
Array [id] = new Random (). Nextint (100);
System.out.println («Компонент» + id + »генерирует:« + массив [id]);
// ждать барьера здесь
System.out.println ("Компонент" + id + "Sleep ...");
barrier.await ();
System.out.println ("Component" + id + "Пробуждение ...");
// Вычислять текущие и последующие значения в массиве данных
int result = массив [id] + массив [id + 1];
System.out.println ("Компонент" + id + "Результат:" + result);
} catch (Exception ex) {
}
}
}
/**
* Проверьте использование Cyclicbarrier
*/
public static void testclicbarrier () {
final int [] array = new int [3];
Cyclicbarrier Barrier = new Cyclicbarrier (2, new Runnable () {
// выполнять, когда все потоки прибывают на барьер
public void run () {
System.out.println ("testciclicbarrier run ...");
массив [2] = массив [0] + массив [1];
}
});
// запустить поток
новый поток (новый ComponentThread (Barrier, Array, 0)). Start ();
новый поток (новый ComponentThread (барьер, массив, 1)). start ();
}
public static void main (string [] args) {
CyclicbarrierTest.testCliclicBarrier ();
}
}