|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjava.util.concurrent.CyclicBarrier
public class CyclicBarrier
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 입니다.
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 |
생성자 의 상세 |
---|
public CyclicBarrier(int parties, Runnable barrierAction)
parties
- 배리어가 여행 하기 전에 await()
를 호출할 필요가 있는 thread의 수barrierAction
- 배리어의 트립시에 실행하는 커멘드. 액션이 존재하지 않는 경우는 null
IllegalArgumentException
- parties
가 1 미만의 경우public CyclicBarrier(int parties)
parties
- 배리어가 여행 하기 전에 await()
를 호출할 필요가 있는 thread의 수
IllegalArgumentException
- parties
가 1 미만의 경우메소드의 상세 |
---|
public int getParties()
public int await() throws InterruptedException , BrokenBarrierException
현재의 thread가, 도착하는 마지막 thread가 아닌 경우, thread의 스케줄링에 관해서 무효가 되어, 다음중 한쪽이 일어날 때까지 대기합니다.
인터럽트
를 실시한다
인터럽트
를 실시한다
reset()
를 호출한다
현재의 thread로,
InterruptedException
가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.
몇개의 thread가 대기중에 배리어로 reset()
가 실행되는지,await 의 호출시, 또는 몇개의 thread가 대기중에 배리어가파괴되었을 경우,BrokenBarrierException
가 throw 됩니다.
대기중의 몇개의 thread로인터럽트가 발생했을 경우, 대기중의 다른 thread가 모두 BrokenBarrierException
를 throw 해, 배리어가 고장 상태에 놓여집니다.
현재의 thread가 도착하는 마지막 thread이며, 생성자 내에서 null 가 아닌 배리어 액션이 지정되는 경우, 현재의 thread는 액션을 실행하고 나서, 다른 thread의 속행을 허가합니다. 배리어 액션중에 예외가 발생하면(자), 현재의 thread내에 그 예외가 전해져 배리어가 고장 상태에 놓여집니다.
getParties()
- 1 은 최초로 도착하는 thread를, 제로는 마지막에 도착하는 thread를 나타낸다
InterruptedException
- 대기중에 현재의 thread로 인터럽트가 발생했을 경우
BrokenBarrierException
- 현재의 thread의 대기중에 다른 thread로 인터럽트가 발생했는지 타임 아웃 했을 경우, 배리어가 리셋 되었을 경우,await
의 호출시에 배리어가 파괴되었을 경우, 또는 예외를 위해서(때문에) 배리어 액션 (존재하는 경우)이 실패했을 경우. public int await(long timeout, TimeUnit unit) throws InterruptedException , BrokenBarrierException , TimeoutException
현재의 thread가, 도착하는 마지막 thread가 아닌 경우, thread의 스케줄링에 관해서 무효가 되어, 다음중 한쪽이 일어날 때까지 대기합니다.
인터럽트
를 실시한다
인터럽트
를 실시한다
reset()
를 호출한다
현재의 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 파라미터의 시간 단위
getParties()
- 1 은 최초로 도착하는 thread를, 제로는 마지막에 도착하는 thread를 나타낸다
InterruptedException
- 대기중에 현재의 thread로 인터럽트가 발생했을 경우
TimeoutException
- 지정된 타임 아웃 시간이 경과했을 경우
BrokenBarrierException
- 현재의 thread의 대기중에 다른 thread로 인터럽트가 발생했는지 타임 아웃 했을 경우, 배리어가 리셋 되었을 경우,await
의 호출시에 배리어가 파괴되었을 경우, 또는 예외를 위해서(때문에) 배리어 액션 (존재하는 경우)이 실패했을 경우. public boolean isBroken()
true
, 그렇지 않은 경우는 false
public void reset()
BrokenBarrierException
로 복귀합니다. 다른 이유로써 절단이 발생한 뒤에 리셋 하는 경우는, 실행이 복잡하게 되는 경우가 있습니다. 즉, 다른 어떠한 방법으로 thread를 재동기 해, 리셋를 실행하는 thread를 선택할 필요가 있습니다. 이러한 상황에서는, 이후에 사용하기 위해서 배리어를 신규 작성하는 편이 바람직한 경우가 있습니다.
public int getNumberWaiting()
await()
로 현재 블록 되고 있는 파티의 수
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.