Phaser 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
재사용 가능한 동기화 장벽으로, 기능 CyclicBarrier
과 CountDownLatch
유사하지만 보다 유연한 사용을 지원합니다.
[Android.Runtime.Register("java/util/concurrent/Phaser", DoNotGenerateAcw=true)]
public class Phaser : Java.Lang.Object
[<Android.Runtime.Register("java/util/concurrent/Phaser", DoNotGenerateAcw=true)>]
type Phaser = class
inherit Object
- 상속
- 특성
설명
재사용 가능한 동기화 장벽으로, 기능 CyclicBarrier
과 CountDownLatch
유사하지만 보다 유연한 사용을 지원합니다.
<b>등록.</b> 다른 장벽의 경우와<<> 달리, 페이저에서 동기화할 등록/em> 파티의 수는 시간이 지남에 따라 달라질 수 있습니다. 작업은 언제든지 등록할 수 있으며(메서드 #register
#bulkRegister
또는 초기 파티 수를 설정하는 생성자 형식 사용) 도착 시 선택적으로 등록을 취소할 수 있습니다(사용#arriveAndDeregister
). 대부분의 기본 동기화 구문의 경우와 마찬가지로 등록 및 등록 취소는 내부 개수에만 영향을 줍니다. 추가 내부 부기 기능을 설정하지 않으므로 작업에서 등록 여부를 쿼리할 수 없습니다. (그러나 이 클래스를 서브클래싱하여 이러한 부기 기능을 도입할 수 있습니다.)
<b>동기화.</b> a와 CyclicBarrier
같이 a가 Phaser
반복적으로 대기될 수 있습니다. 메서드 #arriveAndAwaitAdvance
의 효과는 .을(를) 유사하게 사용합니다 java.util.concurrent.CyclicBarrier#await CyclicBarrier.await
. 단계자의 각 세대에는 연결된 단계 번호가 있습니다. 단계 번호는 0부터 시작하며, 모든 당사자가 페이저에 도착하면 진행되며, 도달한 후 0으로 줄 바꿈됩니다 Integer.MAX_VALUE
. 위상 번호를 사용하면 등록된 당사자가 호출할 수 있는 두 가지 종류의 메서드를 통해 단계별 도착 시와 다른 사람을 기다리는 경우 작업을 독립적으로 제어할 수 있습니다.
<ul>
<li><b>도착.</b> 메서드 #arrive
및 #arriveAndDeregister
레코드 도착. 이러한 메서드는 차단하지 않지만 연결된 <em>도착 단계 번호</em>을 반환합니다. 즉, 도착이 적용된 단계의 위상 번호입니다. 지정된 단계에 대한 최종 당사자가 도착하면 선택적 작업이 수행되고 단계가 진행됩니다. 이러한 작업은 단계 진행을 트리거하는 당사자에 의해 수행되며 종료를 제어하는 재정의 메서드 #onAdvance(int, int)
에 의해 정렬됩니다. 이 메서드를 재정의하는 것은 다음과 유사하지만 보다 유연하여 장벽 동작을 CyclicBarrier
제공합니다.
<li><b>Waiting.</b> 메서드 #awaitAdvance
는 도착 단계 번호를 나타내는 인수가 필요하며, 페이저가 다른 단계로 이동하거나 이미 있는 경우 반환합니다. 사용하는 CyclicBarrier
유사한 생성과 달리 대기 스레드가 중단되더라도 메서드 awaitAdvance
는 계속 대기합니다. 인터럽트 및 시간 제한 버전도 사용할 수 있지만 태스크가 중단적으로 대기하는 동안 또는 시간 제한으로 발생하는 예외는 단계의 상태를 변경하지 않습니다. 필요한 경우 해당 예외의 처리기 내에서 연결된 복구를 수행할 수 있으며, 종종 호출 후에 수행할 수 있습니다 forceTermination
. 에서 실행되는 태스크에서도 페이저를 ForkJoinPool
사용할 수 있습니다. 풀의 병렬 처리 수준이 동시에 차단된 최대 당사자 수를 수용할 수 있는 경우 진행률이 보장됩니다.
</ul>
<b>종료.</b> A 단계자는 메서드#isTerminated
를 <사용하여 확인할 수 있는 em>종료</em> 상태를 입력할 수 있습니다. 종료 시 모든 동기화 메서드는 음수 반환 값으로 표시된 대로 미리 기다리지 않고 즉시 반환됩니다. 마찬가지로, 종료 시 등록하려는 시도는 아무런 영향을 미치지 않습니다. 반환 호출 시 종료가 onAdvance
트리거됩니다 true
. 등록 취소로 인해 등록된 당사자 수가 0이 되면 기본 구현이 반환 true
됩니다. 아래 그림과 같이 단계가 고정된 반복 횟수로 작업을 제어하는 경우 현재 단계 번호가 임계값에 도달하면 종료를 유발하도록 이 메서드를 재정의하는 것이 편리한 경우가 많습니다. 대기 중인 스레드를 갑자기 해제하고 종료할 수 있도록 하는 방법 #forceTermination
도 있습니다.
<b>계층화.</b> Phasers는 경합을< 줄이기 위해 em>계층화/em>(즉, 트리 구조로 생성됨)일 <수 있습니다. 그렇지 않으면 많은 수의 파티가 있는 페이저를 대신 설정하여 하위 단계 그룹이 공통 부모를 공유하도록 설정할 수 있습니다. 이렇게 하면 작업당 오버헤드가 더 커지더라도 처리량이 크게 증가할 수 있습니다.
계층화된 단계의 트리에서 부모로 자식 페이저의 등록 및 등록 취소가 자동으로 관리됩니다. 자식 페이저의 등록된 당사자 수가 0이 아닌 경우(생성자에 #register
설정된 #Phaser(Phaser,int)
대로) 자#bulkRegister
식 페이저가 부모에 등록됩니다. 호출 #arriveAndDeregister
로 인해 등록된 당사자 수가 0이 될 때마다 자식 페이저가 부모에서 등록 취소됩니다.
<b>모니터링.</b> 동기화 메서드는 등록된 당사자만 호출할 수 있지만 모든 호출자가 단계자의 현재 상태를 모니터링할 수 있습니다. 주어진 순간에 총 당사자가 있으며 #getRegisteredParties
, 그 #getArrivedParties
중 현재 단계 (#getPhase
)에 도착했습니다. 나머지 (#getUnarrivedParties
) 당사자가 도착하면 단계가 진행됩니다. 이러한 메서드에서 반환된 값은 일시적인 상태를 반영할 수 있으므로 동기화 제어에 일반적으로 유용하지 않습니다. 메서드 #toString
는 비공식 모니터링에 편리한 형식으로 이러한 상태 쿼리의 스냅샷을 반환합니다.
메모리 일관성 효과: 모든 형태의 도착 방법 <이전의 동작은>해당 단계가 진행되기 전에<> 발생하며 onAdvance 작업(있는 경우)이며, 이는 단계가 진행되기 전에 발생합니다.
<b>샘플 사용법:</b>
A Phaser
는 가변적인 수의 당사자를 CountDownLatch
제공하는 원샷 동작을 제어하는 대신 사용할 수 있습니다. 일반적인 관용구는 이 메서드를 먼저 등록한 다음, 모든 작업을 시작한 다음, 다음과 같이 등록을 취소하는 메서드에 대한 것입니다.
{@code
void runTasks(List<Runnable> tasks) {
Phaser startingGate = new Phaser(1); // "1" to register self
// create and start threads
for (Runnable task : tasks) {
startingGate.register();
new Thread(() -> {
startingGate.arriveAndAwaitAdvance();
task.run();
}).start();
}
// deregister self to allow threads to proceed
startingGate.arriveAndDeregister();
}}
스레드 집합이 지정된 수의 반복에 대해 작업을 반복적으로 수행하도록 하는 한 가지 방법은 다음을 재정 onAdvance
의하는 것입니다.
{@code
void startTasks(List<Runnable> tasks, int iterations) {
Phaser phaser = new Phaser() {
protected boolean onAdvance(int phase, int registeredParties) {
return phase >= iterations - 1 || registeredParties == 0;
}
};
phaser.register();
for (Runnable task : tasks) {
phaser.register();
new Thread(() -> {
do {
task.run();
phaser.arriveAndAwaitAdvance();
} while (!phaser.isTerminated());
}).start();
}
// allow threads to proceed; don't wait for them
phaser.arriveAndDeregister();
}}
주 작업이 나중에 종료를 기다려야 하는 경우 다시 등록한 다음 유사한 루프를 실행할 수 있습니다.
{@code
// ...
phaser.register();
while (!phaser.isTerminated())
phaser.arriveAndAwaitAdvance();}
관련 생성은 단계가 래핑 Integer.MAX_VALUE
되지 않을 것이라는 확신이 있는 컨텍스트에서 특정 단계 번호를 기다리는 데 사용할 수 있습니다. 예시:
{@code
void awaitPhase(Phaser phaser, int phase) {
int p = phaser.register(); // assumes caller not already registered
while (p < phase) {
if (phaser.isTerminated())
// ... deal with unexpected termination
else
p = phaser.arriveAndAwaitAdvance();
}
phaser.arriveAndDeregister();
}}
페이저 트리를 사용하여 작업 집합 n
을 만들려면 생성자가 생성 시 등록하는 작업을 수락하는 Task 클래스를 가정하여 Phaser
다음 형식의 코드를 사용할 수 있습니다. 호출 build(new Task[n], 0, n, new Phaser())
후에는 풀에 제출하여 이러한 작업을 시작할 수 있습니다.
{@code
void build(Task[] tasks, int lo, int hi, Phaser ph) {
if (hi - lo > TASKS_PER_PHASER) {
for (int i = lo; i < hi; i += TASKS_PER_PHASER) {
int j = Math.min(i + TASKS_PER_PHASER, hi);
build(tasks, i, j, new Phaser(ph));
}
} else {
for (int i = lo; i < hi; ++i)
tasks[i] = new Task(ph);
// assumes new Task(ph) performs ph.register()
}
}}
가장 좋은 값 TASKS_PER_PHASER
은 주로 예상 동기화 속도에 따라 달라집니다. 4개 이하의 값은 매우 작은 단계별 작업 본문(따라서 높은 속도)에 적합하거나 매우 큰 작업 본문에 대해 최대 수백 개까지 적합할 수 있습니다.
<b>구현 정보:</b> 이 구현은 최대 파티 수를 65535로 제한합니다. 추가 당사자를 등록하려고 하면 .IllegalStateException
그러나 임의로 큰 참가자 집합을 수용하기 위해 계층화된 페이저를 만들 수 있고 만들어야 합니다.
1.7에 추가되었습니다.
에 대한 java.util.concurrent.Phaser
Java 설명서
이 페이지의 일부는 Android 오픈 소스 프로젝트에서 만들고 공유하고 Creative Commons 2.5 특성 라이선스에 설명된 용어에 따라 사용되는 작업을 기반으로 하는 수정 사항입니다.
생성자
Phaser() |
처음에 등록된 당사자, 부모 없음 및 초기 단계 번호 0이 없는 새 페이저를 만듭니다. |
Phaser(Int32) |
등록된 미혼 당사자 수, 부모 없음 및 초기 단계 번호 0을 사용하여 새 페이저를 만듭니다. |
Phaser(IntPtr, JniHandleOwnership) |
JNI 개체의 관리되는 표현을 만들 때 사용되는 생성자입니다. 런타임에서 호출합니다. |
Phaser(Phaser) |
|
Phaser(Phaser, Int32) |
지정된 부모 및 등록된 미혼 당사자 수를 사용하여 새 페이저를 만듭니다. |
속성
ArrivedParties |
이 단계의 현재 단계에 도착한 등록된 당사자의 수를 반환합니다. |
Class |
이 |
Handle |
기본 Android 인스턴스에 대한 핸들입니다. (다음에서 상속됨 Object) |
IsTerminated |
이 단계가 종료되었는지 여부를 반환 |
JniIdentityHashCode |
재사용 가능한 동기화 장벽으로, 기능 |
JniPeerMembers |
재사용 가능한 동기화 장벽으로, 기능 |
Parent |
이 단계의 부모 또는 |
PeerReference |
재사용 가능한 동기화 장벽으로, 기능 |
Phase |
현재 단계 번호를 반환합니다. |
RegisteredParties |
이 단계자에 등록된 파티의 수를 반환합니다. |
Root |
이 단계의 루트 상위 항목(부모가 없는 경우 이 단계와 동일)을 반환합니다. |
ThresholdClass |
이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다. |
ThresholdType |
이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다. |
UnarrivedParties |
이 단계의 현재 단계에 아직 도착하지 않은 등록된 당사자의 수를 반환합니다. |
메서드
Arrive() |
다른 사용자가 도착할 때까지 기다리지 않고 이 단계체에 도착합니다. |
ArriveAndAwaitAdvance() |
이 단계체에 도착하여 다른 사용자를 기다립니다. |
ArriveAndDeregister() |
이 단계체에 도착하여 다른 사용자가 도착할 때까지 기다리지 않고 등록을 취소합니다. |
AwaitAdvance(Int32) |
현재 단계가 지정된 단계 값과 같지 않거나 이 단계가 종료된 경우 즉시 반환하여 지정된 단계 값에서 진행하기 위해 이 단계의 단계를 기다립니다. |
AwaitAdvanceInterruptibly(Int32) |
현재 단계가 지정된 단계 값과 같지 않거나 이 단계가 종료된 경우 이 단계가 지정된 단계 값에서 진행되도록 대기하거나, 대기하는 동안 중단된 경우 throw |
AwaitAdvanceInterruptibly(Int32, Int64, TimeUnit) |
지정된 단계 값 또는 지정된 시간 제한에서 경과할 때까지 이 단계의 단계를 기다리거나, 대기하는 동안 중단된 경우 throw |
BulkRegister(Int32) |
지정된 새 미혼 당사자 수를 이 페이저에 추가합니다. |
Clone() |
이 개체의 복사본을 만들고 반환합니다. (다음에서 상속됨 Object) |
Dispose() |
재사용 가능한 동기화 장벽으로, 기능 |
Dispose(Boolean) |
재사용 가능한 동기화 장벽으로, 기능 |
Equals(Object) |
다른 개체가 이 개체와 "같음"인지 여부를 나타냅니다. (다음에서 상속됨 Object) |
ForceTermination() |
이 단계가 종료 상태로 들어가도록 합니다. |
GetHashCode() |
개체에 대한 해시 코드 값을 반환합니다. (다음에서 상속됨 Object) |
JavaFinalize() |
가비지 수집에서 개체에 대한 참조가 더 이상 없다고 판단할 때 개체의 가비지 수집기에서 호출됩니다. (다음에서 상속됨 Object) |
Notify() |
이 개체의 모니터에서 대기 중인 단일 스레드를 해제합니다. (다음에서 상속됨 Object) |
NotifyAll() |
이 개체의 모니터에서 대기 중인 모든 스레드를 해제합니다. (다음에서 상속됨 Object) |
OnAdvance(Int32, Int32) |
임박한 단계 진행 시 작업을 수행하고 종료를 제어하는 재정의 가능한 방법입니다. |
Register() |
이 페이저에 새 미혼 파티를 추가합니다. |
SetHandle(IntPtr, JniHandleOwnership) |
Handle 속성을 설정합니다. (다음에서 상속됨 Object) |
ToArray<T>() |
재사용 가능한 동기화 장벽으로, 기능 |
ToString() |
개체의 문자열 표현을 반환합니다. (다음에서 상속됨 Object) |
UnregisterFromRuntime() |
재사용 가능한 동기화 장벽으로, 기능 |
Wait() |
현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 <><중단/종료>합니다.> (다음에서 상속됨 Object) |
Wait(Int64) |
현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다. (다음에서 상속됨 Object) |
Wait(Int64, Int32) |
현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다. (다음에서 상속됨 Object) |
명시적 인터페이스 구현
IJavaPeerable.Disposed() |
재사용 가능한 동기화 장벽으로, 기능 |
IJavaPeerable.DisposeUnlessReferenced() |
재사용 가능한 동기화 장벽으로, 기능 |
IJavaPeerable.Finalized() |
재사용 가능한 동기화 장벽으로, 기능 |
IJavaPeerable.JniManagedPeerState |
재사용 가능한 동기화 장벽으로, 기능 |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
재사용 가능한 동기화 장벽으로, 기능 |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
재사용 가능한 동기화 장벽으로, 기능 |
IJavaPeerable.SetPeerReference(JniObjectReference) |
재사용 가능한 동기화 장벽으로, 기능 |
확장 메서드
JavaCast<TResult>(IJavaObject) |
Android 런타임 확인 형식 변환을 수행합니다. |
JavaCast<TResult>(IJavaObject) |
재사용 가능한 동기화 장벽으로, 기능 |
GetJniTypeName(IJavaPeerable) |
재사용 가능한 동기화 장벽으로, 기능 |