java 병렬 프로 그래 밍 테마(9)---(JUC)CyclicBarrier 분석
5833 단어 자바병렬 프로 그래 밍jucCyclicBarrier
1.CyclicBarrier 안내
Cyclic Barrier 는 순환 적 으로 사용 할 수 있 는 장벽(Barrier)을 의미한다.그것 이 해 야 할 일 은 한 조 의 스 레 드 가 하나의 장벽(동기 점 이 라 고도 할 수 있다)에 도 착 했 을 때 막 히 고 마지막 스 레 드 가 장벽 에 도 착 했 을 때 만 장벽 이 문 을 열 고 모든 장벽 에 의 해 막 힌 스 레 드 가 계속 일 할 수 있다 는 것 이다.JDK 에서 Cyclic Barrier 에 대해 이렇게 말 했다.순환 장 애 는 가끔 서로 기 다 려 야 하 는 고정 크기 의 스 레 드 프로그램 에서 유용 하 다."장벽 은 순환 이 라 고 합 니 다.스 레 드 가 풀 리 기 를 기다 린 후에 다시 사용 할 수 있 기 때 문 입 니 다."Countdown Latch 의 계수 기 를 리 셋 할 수 없습니다.Cyclic Barrier 의 계산 기 는 리 셋 되 어 사용 할 수 있 기 때문에 순환 의 barrier 라 고 불 린 다.
우 리 는 먼저 그의 구조 방법 과 사용 방식 을 살 펴 보 자.
구조 함수:
CyclicBarrier(int parties)//그 매개 변 수 는 장벽 이 차단 하 는 스 레 드 수량 을 나타 내 고 모든 스 레 드 는 await 방법 으로 알려 줍 니 다.
Cyclic Barrier 에 대해 서 는 장벽 에 도 착 했 고 현재 스 레 드 가 막 혔 습 니 다.
CyclicBarrier(int parties,Runnable barrier Action)//새로운 CyclicBarrier 를 만 듭 니 다.
주어진 수량의 참여 자(스 레 드)가 그것 을 기다 리 고 있 을 때,그것 은 스위치 를 뛰 어 넘 을 것 이다.
주어진 장애 동작(Runnable 매개 변수 제공)을 실행 하고 마지막 스 레 드 에서 장애 에 들 어 갑 니 다.
방법:
int await() //모든 참여 자 들 이 이 barrier 에서 await 방법 을 호출 하기 전에 기다 릴 것 입 니 다.
방법 은 기다 리 거나 지 정 된 대기 시간 을 초과 할 것 이다.
int getNumberWaiting() //현재 장벽 에서 기다 리 고 있 는 참여 자 수 를 되 돌려 줍 니 다.
int getParties() //이 barrier 를 시작 하 라 는 참여 자 수 를 되 돌려 줍 니 다.
boolean isBroken() //이 장벽 이 파손 상태 에 있 는 지 확인 합 니 다.
void reset() //장벽 을 초기 상태 로 초기 화 합 니 다.
다음은 작은 프로그램 을 살 펴 보고 Cyclic Barrier 의 사용 방식 을 알 아 보 겠 습 니 다.
public class CyclicBarrierTest {
static CyclicBarrier c = new CyclicBarrier(2);
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
try {
c.await();
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName()+" ...");
}
}).start();
try {
c.await();
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName()+" ...");
System.out.println(" , "+c.getParties()+" ");
}
}
출력 결 과 는:Thread-0 이 기다 리 고 있 습 니 다...
main 대기 중...
사람 이 충분 하 니 출발 합 시다.현재 두 사람 이 경기 에 참가 하고 있 습 니 다.
Process finished with exit code 0
위 프로그램 에서"static CyclicBarrier c=new CyclicBarrier(2);"매개 변수 2 가 3 으로 바 뀌 면 프로그램의 스 레 드 Thread-0 과 main 은 계속 기 다 립 니 다.Cyclic Barrier 는 한 스 레 드 를 하나의 장벽(동기 점 이 라 고도 부 를 수 있 음)에 도달 하 게 할 때 막 히 고 마지막 스 레 드 가 장벽 에 도착 할 때 까지 장벽 이 열 리 지 않 기 때문에 마지막 스 레 드 가 늦 어 지지 않 기 때문에 장벽 도 열 리 지 않 습 니 다.
Cyclicbarrier 는 더 높 은 구조 함수 Cyclicbarrier(int parties,Runnable barrierAction)를 제공 하여 스 레 드 가 장벽 에 도 착 했 을 때 barrierAction 을 우선 실행 하여 더욱 복잡 한 업무 장면 을 처리 하 는 데 편리 합 니 다.예 시 를 살 펴 보 자.
public class CyclicBarrierTest {
static CyclicBarrier c = new CyclicBarrier(2,new PrioExecut());
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
try {
c.await();
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName()+" ...");
}
}).start();
try {
c.await();
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName()+" ...");
System.out.println(" , "+c.getParties()+" ");
}
}
class PrioExecut implements Runnable{
@Override
public void run() {
System.out.println(" 5 , !");
}
}
실행 결 과 는:나 는 먼저 5 초 를 뛸 것 이다.네가 믿 든 안 믿 든!
Thread-0 이 기다 리 고 있 습 니 다...
main 대기 중...
사람 이 충분 하 니 출발 합 시다.현재 두 사람 이 경기 에 참가 하고 있 습 니 다.
Process finished with exit code 0
구조 방법의 매개 변 수 를 볼 수 있 습 니 다.new PrioExecut()의 스 레 드 가 우선 실 행 됩 니 다.
2.CyclicBarrier 의 응용 장면
Cyclic Barrier 는 다 중 스 레 드 로 데 이 터 를 계산 하고 마지막 으로 결 과 를 계산 하 는 응용 장면 을 통합 할 수 있 습 니 다.예 를 들 어 지불 업무 에서 우 리 는 사전에 구 분 된 구역 의 형식 에 따라 일수 지 의 흐름 을 통계 한 다음 에 구역 의 계산 결과 에 따라 Runnable barrierAction 을 사용 하여 집계 하 는 것 이 좋 은 실현 이다.
3.Cyclic Barrier 와 Count Downlatch 의 차이
javadoc 에서 의 설명 은 다음 과 같 습 니 다:
CountDownLatch: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.