다음을 통해 공유


Phaser 클래스

정의

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

[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
상속
Phaser
특성

설명

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

<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.PhaserJava 설명서

이 페이지의 일부는 Android 오픈 소스 프로젝트에서 만들고 공유하고 Creative Commons 2.5 특성 라이선스에 설명된 용어에 따라 사용되는 작업을 기반으로 하는 수정 사항입니다.

생성자

Phaser()

처음에 등록된 당사자, 부모 없음 및 초기 단계 번호 0이 없는 새 페이저를 만듭니다.

Phaser(Int32)

등록된 미혼 당사자 수, 부모 없음 및 초기 단계 번호 0을 사용하여 새 페이저를 만듭니다.

Phaser(IntPtr, JniHandleOwnership)

JNI 개체의 관리되는 표현을 만들 때 사용되는 생성자입니다. 런타임에서 호출합니다.

Phaser(Phaser)

#Phaser(Phaser, int) Phaser(parent, 0)과 동일합니다.

Phaser(Phaser, Int32)

지정된 부모 및 등록된 미혼 당사자 수를 사용하여 새 페이저를 만듭니다.

속성

ArrivedParties

이 단계의 현재 단계에 도착한 등록된 당사자의 수를 반환합니다.

Class

Object런타임 클래스를 반환합니다.

(다음에서 상속됨 Object)
Handle

기본 Android 인스턴스에 대한 핸들입니다.

(다음에서 상속됨 Object)
IsTerminated

이 단계가 종료되었는지 여부를 반환 true 합니다.

JniIdentityHashCode

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
JniPeerMembers

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

Parent

이 단계의 부모 또는 null 없는 경우 반환합니다.

PeerReference

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
Phase

현재 단계 번호를 반환합니다.

RegisteredParties

이 단계자에 등록된 파티의 수를 반환합니다.

Root

이 단계의 루트 상위 항목(부모가 없는 경우 이 단계와 동일)을 반환합니다.

ThresholdClass

이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

ThresholdType

이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

UnarrivedParties

이 단계의 현재 단계에 아직 도착하지 않은 등록된 당사자의 수를 반환합니다.

메서드

Arrive()

다른 사용자가 도착할 때까지 기다리지 않고 이 단계체에 도착합니다.

ArriveAndAwaitAdvance()

이 단계체에 도착하여 다른 사용자를 기다립니다.

ArriveAndDeregister()

이 단계체에 도착하여 다른 사용자가 도착할 때까지 기다리지 않고 등록을 취소합니다.

AwaitAdvance(Int32)

현재 단계가 지정된 단계 값과 같지 않거나 이 단계가 종료된 경우 즉시 반환하여 지정된 단계 값에서 진행하기 위해 이 단계의 단계를 기다립니다.

AwaitAdvanceInterruptibly(Int32)

현재 단계가 지정된 단계 값과 같지 않거나 이 단계가 종료된 경우 이 단계가 지정된 단계 값에서 진행되도록 대기하거나, 대기하는 동안 중단된 경우 throw InterruptedException 하거나, 즉시 반환합니다.

AwaitAdvanceInterruptibly(Int32, Int64, TimeUnit)

지정된 단계 값 또는 지정된 시간 제한에서 경과할 때까지 이 단계의 단계를 기다리거나, 대기하는 동안 중단된 경우 throw InterruptedException 하거나, 현재 단계가 지정된 단계 값과 같지 않거나 이 단계가 종료된 경우 즉시 반환합니다.

BulkRegister(Int32)

지정된 새 미혼 당사자 수를 이 페이저에 추가합니다.

Clone()

이 개체의 복사본을 만들고 반환합니다.

(다음에서 상속됨 Object)
Dispose()

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
Dispose(Boolean)

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
Equals(Object)

다른 개체가 이 개체와 "같음"인지 여부를 나타냅니다.

(다음에서 상속됨 Object)
ForceTermination()

이 단계가 종료 상태로 들어가도록 합니다.

GetHashCode()

개체에 대한 해시 코드 값을 반환합니다.

(다음에서 상속됨 Object)
JavaFinalize()

가비지 수집에서 개체에 대한 참조가 더 이상 없다고 판단할 때 개체의 가비지 수집기에서 호출됩니다.

(다음에서 상속됨 Object)
Notify()

이 개체의 모니터에서 대기 중인 단일 스레드를 해제합니다.

(다음에서 상속됨 Object)
NotifyAll()

이 개체의 모니터에서 대기 중인 모든 스레드를 해제합니다.

(다음에서 상속됨 Object)
OnAdvance(Int32, Int32)

임박한 단계 진행 시 작업을 수행하고 종료를 제어하는 재정의 가능한 방법입니다.

Register()

이 페이저에 새 미혼 파티를 추가합니다.

SetHandle(IntPtr, JniHandleOwnership)

Handle 속성을 설정합니다.

(다음에서 상속됨 Object)
ToArray<T>()

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
ToString()

개체의 문자열 표현을 반환합니다.

(다음에서 상속됨 Object)
UnregisterFromRuntime()

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
Wait()

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 <><중단/종료>합니다.>

(다음에서 상속됨 Object)
Wait(Int64)

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다.

(다음에서 상속됨 Object)
Wait(Int64, Int32)

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다.

(다음에서 상속됨 Object)

명시적 인터페이스 구현

IJavaPeerable.Disposed()

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
IJavaPeerable.DisposeUnlessReferenced()

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
IJavaPeerable.Finalized()

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
IJavaPeerable.JniManagedPeerState

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

(다음에서 상속됨 Object)

확장 메서드

JavaCast<TResult>(IJavaObject)

Android 런타임 확인 형식 변환을 수행합니다.

JavaCast<TResult>(IJavaObject)

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

GetJniTypeName(IJavaPeerable)

재사용 가능한 동기화 장벽으로, 기능 CyclicBarrierCountDownLatch 유사하지만 보다 유연한 사용을 지원합니다.

적용 대상