다음과 같이 코드 코드를 복사합니다 .
공개 클래스 TestCyclicBarrier {
개인 정적 최종 int THREAD_NUM = 5;
공개 정적 클래스 WorkerThread는 Runnable을 구현합니다.{
순환 장벽 장벽;
공공 WorkerThread(순환 장벽 b){
this.barrier = b;
}
@보수
공개 무효 실행() {
// TODO 자동 생성된 메서드 스텁
노력하다{
System.out.println("작업자가 기다리고 있습니다.");
//스레드는 모든 스레드가 장벽에 도달할 때까지 여기서 기다립니다.
Barrier.await();
System.out.println("ID:"+Thread.currentThread().getId()+" 작업 중");
}catch(예외 e){
e.printStackTrace();
}
}
}
/**
* @param 인수
*/
공개 정적 무효 메인(String[] args) {
// TODO 자동 생성된 메서드 스텁
CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
//모든 스레드가 장벽에 도달하면 실행됩니다.
@보수
공개 무효 실행() {
// TODO 자동 생성된 메서드 스텁
System.out.println("내부 장벽");
}
});
for(int i=0;i<THREAD_NUM;i++){
new Thread(new WorkerThread(cb)).start();
}
}
}
/*
출력은 다음과 같습니다.
작업자가 기다리고 있습니다.
작업자가 기다리고 있습니다.
작업자가 기다리고 있습니다.
작업자가 기다리고 있습니다.
작업자가 기다리고 있습니다.
내부 장벽
ID:12 작동 중
ID:8 작동 중
ID:11 작동 중
ID:9 작동 중
ID:10 작동 중
*/
1. CyclicBarrier 초기화 시 숫자를 지정한 후 CyclicBarrier.await()를 호출하여 대기하는 스레드 개수를 계산합니다. 스레드 수가 이 숫자에 도달하면 대기 상태에 들어간 모든 스레드가 깨어나 계속됩니다.
2. CyclicBarrier는 이름에서 알 수 있듯이 장애물로 간주될 수 있습니다. 이 장애물을 함께 통과하려면 모든 스레드가 존재해야 합니다.
3. CyclicBarrier는 초기에 Runnable 매개변수를 사용할 수도 있습니다. 이 Runnable 작업은 CyclicBarriers 수에 도달한 후 다른 모든 스레드가 활성화되기 전에 실행됩니다.