JavaTM Platform
Standard Ed. 6

java.util.concurrent
클래스 CyclicBarrier

java.lang.Object 
  상위를 확장 java.util.concurrent.CyclicBarrier


public class CyclicBarrier
extends Object

thread 세트의 각각이 공통의 배리어 포인트에 이를 때까지 대기하는 것을 가능하게 하는 동기화 지원 기능입니다. CyclicBarrier 는, 서로 대기하는 것이 필요하게 되는 일이 있는, 고정 사이즈의 thread 파티가 관계하는 프로그램으로 유용합니다. 배리어는, 대기중의 thread가 해제된 후에 재사용할 수 있기 (위해)때문에,cyclic ( 「순환식」)로 불립니다.

CyclicBarrier 는, 옵션 Runnable 커멘드를 지원합니다. 이것은, 파티내의 마지막 thread가 도착한 후에, 어느 thread도 해제되기 전에, 배리어 포인트 마다 1 회 실행됩니다. 이 「배리어 액션」은, 파티중 한쪽이 처리를 속행하기 전에 공유 상태를 갱신하는데 도움이 됩니다.

사용예는 다음과 같습니다. 다음에, 병렬 분해 설계에서의 배리어의 사용예를 나타냅니다.

 class Solver {
   final int N;
   final float[][] data;
   final CyclicBarrier barrier;

   class Worker implements Runnable {
     int myRow;
     Worker(int row) { myRow = row; }
     public void run() {
       while (! done()) {
         processRow(myRow);

         try {
           barrier.await();
         } catch (InterruptedException ex) {
           return;
         } catch (BrokenBarrierException ex) {
           return;
         }
       }
     }
   }

   public Solver(float[][] matrix) {
     data = matrix;
     N = matrix.length;
     barrier = new CyclicBarrier(N,
                                 new Runnable() {
                                   public void run() {
                                     mergeRows(...);
                                   }
                                 });
     for (int i = 0; i < N; ++i)
       new Thread(new Worker(i)). start();

     waitUntilDone();
   }
 }
 
여기서, 각 워크스 레드는 행렬의 1 행을 처리해, 모든 행이 처리될 때까지 배리어로 대기합니다. 모든 행이 처리되면(자), 지정된 Runnable 배리어 액션이 실행되어, 행을 머지 합니다. 처리 결과가 성공했다고 기업의 합병이 판정하면(자),done()true 를 돌려주어, 각 워커가 종료합니다.

배리어 액션이 그 실행시에, 파티가 중단하고 있지 않아도 좋은 경우, 파티내의 몇개의 thread는 해제될 때, 그 액션을 실행할 수 있습니다. 이것을 용이하게 하기 위한(해),await() 의 각 호출은, 배리어의 위치에서 그 thread의 도착 인덱스를 돌려줍니다. 그 후, 배리어 액션을 실행하는 thread를 선택할 수 있습니다. 다음에 예를 나타냅니다.

  if (barrier.await() == 0) {
     // log the completion of this iteration
   }

CyclicBarrier 는, 실패한 동기화의 시도에 대해서 전인가 무인가의 절단 모델을 사용합니다. 끼어들어, 실패, 또는 타임 아웃을 위해서(때문에) 1 개의 thread가 배리어 포인트를 넘으면(자), 그 배리어 포인트로 대기하고 있는 것 외의 모든 thread도 BrokenBarrierException 를 throw 해 이상하게 배리어 포인트를 넘어 버립니다. 다른 thread에서도 거의 동시에 인터럽트가 발생하는 경우는 InterruptedException 를 throw 합니다.

메모리 무결성 효과:await() 를 호출하기 전의 thread내의 액션은, 배리어 액션의 일부인 액션보다 happen-before 이며, 한편 그것은, 다른 thread내의 대응하는 await() 로부터의 정상적인 복귀뒤의 액션보다 happen-before 입니다.

도입된 버젼:
1.5
관련 항목:
CountDownLatch

생성자 의 개요
CyclicBarrier (int parties)
          지정된 수의 파티 (thread)가 대기 상태에 있는 경우에 여행 하는, 새로운 CyclicBarrier 를 작성합니다.
CyclicBarrier (int parties, Runnable  barrierAction)
          지정된 수의 파티 (thread)가 대기 상태에 있는 경우에 여행 하는, 새로운 CyclicBarrier 를 작성합니다.
 
메소드의 개요
 int await ()
          모든파티가 이 배리어로 await 를 호출할 때까지 대기합니다.
 int await (long timeout, TimeUnit  unit)
          모든파티가 이 배리어로 await 를 호출하는지, 지정된 대기 시간이 경과할 때까지 대기합니다.
 int getNumberWaiting ()
          배리어로 현재 대기하고 있는 파티의 수를 돌려줍니다.
 int getParties ()
          이 배리어의 여행에 필요한 파티의 수를 돌려줍니다.
 boolean isBroken ()
          이 배리어가 고장 상태에 있을지 어떨지를 문의합니다.
 void reset ()
          배리어를 초기 상태에 리셋 합니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
 

생성자 의 상세

CyclicBarrier

public CyclicBarrier(int parties,
                     Runnable  barrierAction)
지정된 수의 파티 (thread)가 대기 상태에 있는 경우에 여행 하는, 새로운 CyclicBarrier 를 작성합니다. 배리어의 트립시에, 지정된 배리어 액션이, 마지막에 배리어에 들어간 thread에 의해 실행됩니다.

파라미터:
parties - 배리어가 여행 하기 전에 await() 를 호출할 필요가 있는 thread의 수
barrierAction - 배리어의 트립시에 실행하는 커멘드. 액션이 존재하지 않는 경우는 null
예외:
IllegalArgumentException - parties 가 1 미만의 경우

CyclicBarrier

public CyclicBarrier(int parties)
지정된 수의 파티 (thread)가 대기 상태에 있는 경우에 여행 하는, 새로운 CyclicBarrier 를 작성합니다. 배리어의 트립시에, 정의 끝난 액션은 실행되지 않습니다.

파라미터:
parties - 배리어가 여행 하기 전에 await() 를 호출할 필요가 있는 thread의 수
예외:
IllegalArgumentException - parties 가 1 미만의 경우
메소드의 상세

getParties

public int getParties()
이 배리어의 여행에 필요한 파티의 수를 돌려줍니다.

반환값:
이 배리어의 여행에 필요한 파티의 수

await

public int await()
          throws InterruptedException ,
                 BrokenBarrierException 
모든파티가 이 배리어로 await 를 호출할 때까지 대기합니다.

현재의 thread가, 도착하는 마지막 thread가 아닌 경우, thread의 스케줄링에 관해서 무효가 되어, 다음중 한쪽이 일어날 때까지 대기합니다.

현재의 thread로,

InterruptedException 가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.

몇개의 thread가 대기중에 배리어로 reset() 가 실행되는지,await 의 호출시, 또는 몇개의 thread가 대기중에 배리어가파괴되었을 경우,BrokenBarrierException 가 throw 됩니다.

대기중의 몇개의 thread로인터럽트가 발생했을 경우, 대기중의 다른 thread가 모두 BrokenBarrierException 를 throw 해, 배리어가 고장 상태에 놓여집니다.

현재의 thread가 도착하는 마지막 thread이며, 생성자 내에서 null 가 아닌 배리어 액션이 지정되는 경우, 현재의 thread는 액션을 실행하고 나서, 다른 thread의 속행을 허가합니다. 배리어 액션중에 예외가 발생하면(자), 현재의 thread내에 그 예외가 전해져 배리어가 고장 상태에 놓여집니다.

반환값:
현재의 thread의 도착 인덱스. 인덱스 getParties() - 1 은 최초로 도착하는 thread를, 제로는 마지막에 도착하는 thread를 나타낸다
예외:
InterruptedException - 대기중에 현재의 thread로 인터럽트가 발생했을 경우
BrokenBarrierException - 현재의 thread의 대기중에 다른 thread로 인터럽트가 발생했는지 타임 아웃 했을 경우, 배리어가 리셋 되었을 경우,await 의 호출시에 배리어가 파괴되었을 경우, 또는 예외를 위해서(때문에) 배리어 액션 (존재하는 경우)이 실패했을 경우.

await

public int await(long timeout,
                 TimeUnit  unit)
          throws InterruptedException ,
                 BrokenBarrierException ,
                 TimeoutException 
모든파티가 이 배리어로 await 를 호출하는지, 지정된 대기 시간이 경과할 때까지 대기합니다.

현재의 thread가, 도착하는 마지막 thread가 아닌 경우, thread의 스케줄링에 관해서 무효가 되어, 다음중 한쪽이 일어날 때까지 대기합니다.

현재의 thread로,

InterruptedException 가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.

지정된 대기 시간이 경과하면(자),TimeoutException 가 throw 됩니다. 시간이 제로 또는 그것보다 작은 경우, 메소드는 대기하지 않습니다.

몇개의 thread가 대기중에 배리어로 reset() 가 실행되는지,await 의 호출시, 또는 몇개의 thread가 대기중에 배리어가파괴되었을 경우,BrokenBarrierException 가 throw 됩니다.

대기중의 몇개의 thread로인터럽트가 발생했을 경우, 대기중의 다른 thread가 모두 BrokenBarrierException 를 throw 해, 배리어가 고장 상태에 놓여집니다.

현재의 thread가 도착하는 마지막 thread이며, 생성자 내에서 null 가 아닌 배리어 액션이 지정되는 경우, 현재의 thread는 액션을 실행하고 나서, 다른 thread의 속행을 허가합니다. 배리어 액션중에 예외가 발생하면(자), 현재의 thread내에 그 예외가 전해져 배리어가 고장 상태에 놓여집니다.

파라미터:
timeout - 배리어를 대기하는 시간
unit - timeout 파라미터의 시간 단위
반환값:
현재의 thread의 도착 인덱스. 인덱스 getParties() - 1 은 최초로 도착하는 thread를, 제로는 마지막에 도착하는 thread를 나타낸다
예외:
InterruptedException - 대기중에 현재의 thread로 인터럽트가 발생했을 경우
TimeoutException - 지정된 타임 아웃 시간이 경과했을 경우
BrokenBarrierException - 현재의 thread의 대기중에 다른 thread로 인터럽트가 발생했는지 타임 아웃 했을 경우, 배리어가 리셋 되었을 경우,await 의 호출시에 배리어가 파괴되었을 경우, 또는 예외를 위해서(때문에) 배리어 액션 (존재하는 경우)이 실패했을 경우.

isBroken

public boolean isBroken()
이 배리어가 고장 상태에 있을지 어떨지를 문의합니다.

반환값:
배리어의 구축 또는 마지막 리셋 이후, 끼어들어 또는 타임 아웃을 위해서(때문에) 1 개 이상의 파티가 이 배리어를 파괴했는지, 예외를 위해서(때문에) 배리어 액션이 실패했을 경우는 true, 그렇지 않은 경우는 false

reset

public void reset()
배리어를 초기 상태에 리셋 합니다. 몇개의 파티가 현재 배리어로 대기중의 경우는,BrokenBarrierException 로 복귀합니다. 다른 이유로써 절단이 발생한 뒤에 리셋 하는 경우는, 실행이 복잡하게 되는 경우가 있습니다. 즉, 다른 어떠한 방법으로 thread를 재동기 해, 리셋를 실행하는 thread를 선택할 필요가 있습니다. 이러한 상황에서는, 이후에 사용하기 위해서 배리어를 신규 작성하는 편이 바람직한 경우가 있습니다.


getNumberWaiting

public int getNumberWaiting()
배리어로 현재 대기하고 있는 파티의 수를 돌려줍니다. 이 메소드는, 주로 디버그와 assertion로 도움이 됩니다.

반환값:
await() 로 현재 블록 되고 있는 파티의 수

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.