Скопируйте код кода следующим образом:
общественный класс TestCyclicBarrier {
частный статический финал int THREAD_NUM = 5;
публичный статический класс WorkerThread реализует Runnable{
Циклический Барьерный барьер;
общественный WorkerThread (CyclicBarrier b) {
this.barrier = b;
}
@Override
общественный недействительный запуск () {
// TODO Автоматически сгенерированная заглушка метода
пытаться{
System.out.println("Рабочий ожидает");
//Потоки ждут здесь, пока все потоки не достигнут барьера.
барьер.ожидание();
System.out.println("ID:"+Thread.currentThread().getId()+" Работает");
}catch(Исключение е){
е.printStackTrace();
}
}
}
/**
* @param аргументы
*/
public static void main(String[] args) {
// TODO Автоматически сгенерированная заглушка метода
CyclicBarrier cb = новый CyclicBarrier(THREAD_NUM, new Runnable() {
//Выполняется, когда все потоки достигают барьера
@Override
общественный недействительный запуск () {
// TODO Автоматически сгенерированная заглушка метода
System.out.println("Внутренний барьер");
}
});
for(int i=0;i<THREAD_NUM;i++){
новый поток (новый WorkerThread (cb)). start ();
}
}
}
/*
Вот результат:
Рабочий ждет
Рабочий ждет
Рабочий ждет
Рабочий ждет
Рабочий ждет
Внутренний барьер
ID:12 Работает
ID:8 Работает
ID:11 Работает
ID:9 Работает
ID:10 Работает
*/
1. Укажите число при инициализации CyclicBarrier, а затем рассчитайте количество потоков, которые вызывают CyclicBarrier.await() для ожидания. Когда количество потоков достигает этого числа, все потоки, вошедшие в состояние ожидания, пробуждаются и продолжают работу.
2. CyclicBarrier, как следует из названия, можно рассматривать как препятствие. Все потоки должны присутствовать, прежде чем они смогут вместе преодолеть это препятствие.
3. CyclicBarrier также может изначально принимать параметр Runnable. Эта задача Runnable будет выполняться после достижения количества CyclicBarriers и до пробуждения всех остальных потоков.