코드 사본은 다음과 같습니다.
패키지 com.yao;
java.util.random import;
import java.util.concurrent.cyclicbarrier;
/**
* Cyclicbarrier는 CountdownLatch와 유사하며 카운터이기도합니다.
* 차이점은 Cyclicbarrier의 수를 CyclicBarrier.await ()라고하며 대기 번호를 입력한다는 것입니다.
* 스레드 수가 Cyclicbarrier의 초기 시간에 지정된 숫자에 도달하면 대기 상태에 입력하는 모든 스레드가 깨어나고 계속됩니다.
* 이름과 마찬가지로 CycleCharrier는 장애물로 간주 될 수 있습니다.
* 모든 스레드는이 장애물을 함께 전달하기 전에 도착해야합니다.
* Cyclicbarrier는 처음에 실행 가능한 매개 변수를 가질 수 있습니다.
* Cyclicbarrier의 수에 도달 한 후에는 다른 모든 스레드가 깨어나 기 전에 실행됩니다.
*/
공개 클래스 cyclicbarriertest {
공개 정적 클래스 componentshread는 runnable {
Cyclicbarrier 장벽; // 카운터
int id; // 구성 요소 ID
int [] 배열; // 데이터 배열
// 구성 방법
public componentthread (cyclicbarrier barrier, int [] array, int id) {
이. 바리어 = 장벽;
this.id = id;
this.array = 배열;
}
public void run () {
노력하다 {
배열 [id] = new random (). NextInt (100);
System.out.println ( "구성 요소" + id + "생성 :" + 배열 [id]);
// 여기서 장벽을 기다립니다
System.out.println ( "구성 요소" + id + "sleep ...");
Barrier.await ();
System.out.println ( "구성 요소" + id + "awakened ...");
// 데이터 배열의 현재 및 후속 값 계산
int result = array [id] + 배열 [id + 1];
System.out.println ( "구성 요소" + id + "결과 :" + result);
} catch (예외) {
}
}
}
/**
* Cyclicbarrier의 사용법을 테스트하십시오
*/
공개 정적 void tedcyclicbarrier () {
최종 int [] array = new int [3];
Cyclicbarrier Barrier = New Cyclicbarrier (2, New Runnable () {
// 모든 스레드가 장벽에 도착하면 실행됩니다
public void run () {
System.out.println ( "Tedcyclicbarrier Run ...");
배열 [2] = 배열 [0] + 배열 [1];
}
});
// 스레드를 시작합니다
새 스레드 (new componentthread (배리어, 배열, 0)). start ();
새 스레드 (new componentthread (배리어, 배열, 1)). start ();
}
public static void main (String [] args) {
cyclicbarriertest.testcyclicbarrier ();
}
}