Share via


ICondition 인터페이스

정의

ConditionObject 는 모니터 메서드(Object#wait() waitObject#notify notifyObject#notifyAll notifyAll)를 고유한 개체로 변환하여 개체당 여러 대기 집합을 포함하는 효과를 주기 위해 임 Lock 의 구현을 사용하여 이를 결합합니다.

[Android.Runtime.Register("java/util/concurrent/locks/Condition", "", "Java.Util.Concurrent.Locks.IConditionInvoker")]
public interface ICondition : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/util/concurrent/locks/Condition", "", "Java.Util.Concurrent.Locks.IConditionInvoker")>]
type ICondition = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
파생
특성
구현

설명

ConditionObject 는 모니터 메서드(Object#wait() waitObject#notify notifyObject#notifyAll notifyAll)를 고유한 개체로 변환하여 개체당 여러 대기 집합을 포함하는 효과를 주기 위해 임 Lock 의 구현을 사용하여 이를 결합합니다. 경우는 Lock 메서드 및 문의 Condition 사용을 synchronized 대체 합니다 개체 모니터 메서드의 사용을 대체 합니다.

조건(em condition queues</em> 또는 <em>condition variables</em>이라고<도 함)은 한 스레드가 실행을 일시 중단하는 수단을 제공합니다(&따옴표로 묶을 수 있음;> 대기&따옴표;) 다른 스레드에서 일부 상태 조건이 true일 수 있다는 알림을 받을 때까지 이 공유 상태 정보에 대한 액세스는 서로 다른 스레드에서 발생하기 때문에 보호되어야 하므로 일부 양식의 잠금은 조건과 연결됩니다. 조건을 기다리는 것이 제공하는 키 속성은 <>연결된 잠금을 원자성</em>으로 해제하고 와 같이 Object.wait현재 스레드를 일시 중단한다는 것입니다.

Condition instance 기본적으로 잠금에 바인딩됩니다. 특정 Lock instance 대한 instance 가져오 Condition 려면 해당 메서드를 Lock#newCondition newCondition() 사용합니다.

예를 들어 및 take 메서드를 지원하는 제한된 버퍼가 있다고 가정해 put 보겠습니다. 빈 버퍼에서 를 take 시도하면 항목을 사용할 수 있을 때까지 스레드가 차단됩니다. 전체 버퍼에서 를 put 시도하면 스레드는 공간을 사용할 수 있을 때까지 차단됩니다. 버퍼에서 항목 또는 공간을 사용할 수 있게 될 때 단일 스레드만 알리는 최적화를 사용할 수 있도록 대기 put 스레드와 take 스레드를 별도의 대기 집합에 유지하려고 합니다. 이 작업은 두 개의 Condition 인스턴스를 사용하여 수행할 수 있습니다.

class BoundedBuffer&lt;E&gt; {
<b>final Lock lock = new ReentrantLock();</b>
              final Condition notFull  = <b>lock.newCondition(); </b>
              final Condition notEmpty = <b>lock.newCondition(); </b>

              final Object[] items = new Object[100];
              int putptr, takeptr, count;

              public void put(E x) throws InterruptedException {
<b>lock.lock();
                try {</b>
                  while (count == items.length)
<b>notFull.await();</b>
                  items[putptr] = x;
                  if (++putptr == items.length) putptr = 0;
                  ++count;
<b>notEmpty.signal();</b>
<b>} finally {
                  lock.unlock();
                }</b>
              }

              public E take() throws InterruptedException {
<b>lock.lock();
                try {</b>
                  while (count == 0)
<b>notEmpty.await();</b>
                  E x = (E) items[takeptr];
                  if (++takeptr == items.length) takeptr = 0;
                  --count;
<b>notFull.signal();</b>
                  return x;
<b>} finally {
                  lock.unlock();
                }</b>
              }
            }

(클래스는 java.util.concurrent.ArrayBlockingQueue 이 기능을 제공하므로 이 샘플 사용 클래스를 구현할 이유가 없습니다.)

구현은 Condition 알림 순서를 보장하거나 알림을 수행할 때 잠금을 유지하지 않아도 되는 등 모니터 메서드와 다른 Object 동작 및 의미 체계를 제공할 수 있습니다. 구현에서 이러한 특수한 의미 체계를 제공하는 경우 구현은 이러한 의미 체계를 문서화해야 합니다.

Condition 인스턴스는 일반 개체일 뿐이며 문에서 synchronized 대상으로 사용할 수 있으며 자체 모니터 Object#wait waitObject#notify notify 메서드를 호출할 수 있습니다. instance 모니터 잠금 Condition 을 획득하거나 해당 모니터 메서드를 사용하는 경우 관련 Condition 을 획득 Lock 하거나 #await 대기 및 #signal 신호 메서드를 사용하는 것과 지정된 관계가 없습니다. 혼동을 방지하려면 자체 구현 내에서 인스턴스를 사용하지 Condition 않는 것이 좋습니다.

언급된 경우를 제외하고 모든 매개 변수에 null 대한 값을 전달하면 가 NullPointerException throw됩니다.

<h2>구현 고려 사항</h2>

Condition기다리는 경우 &따옴표입니다<.em>가짜 절전 모드 해제</em>&따옴표; 기본 플랫폼 의미 체계에 대한 양보로 일반적으로 발생할 수 있습니다. 이는 대기 중인 상태 조건자를 테스트하는 루프에서 항상 대기해야 하므로 Condition 대부분의 애플리케이션 프로그램에 거의 실질적인 영향을 미치지 않습니다. 구현은 가짜 절전 모드 해제의 가능성을 제거할 수 있지만 애플리케이션 프로그래머는 항상 발생할 수 있다고 가정하므로 항상 루프에서 대기하는 것이 좋습니다.

대기하는 세 가지 형태의 조건(인터럽트 가능, 비 인터럽트 가능 및 시간 제한)은 일부 플랫폼에서 구현의 용이성과 성능 특성이 다를 수 있습니다. 특히 이러한 기능을 제공하고 주문 보장과 같은 특정 의미 체계를 유지하기가 어려울 수 있습니다. 또한 스레드의 실제 일시 중단을 중단하는 기능이 모든 플랫폼에서 구현하는 것이 항상 가능하지는 않을 수 있습니다.

따라서 세 가지 형태의 대기 모두에 대해 정확히 동일한 보장 또는 의미 체계를 정의하기 위해 구현이 필요하지 않으며 스레드의 실제 일시 중단을 지원할 필요도 없습니다.

각 대기 메서드에서 제공하는 의미 체계 및 보장을 명확하게 문서화하려면 구현이 필요하며, 구현이 스레드 일시 중단 중단을 지원하는 경우 이 인터페이스에 정의된 대로 중단 의미 체계를 준수해야 합니다.

인터럽트는 일반적으로 취소를 의미하고 중단에 대한 검사는 자주 수행되지 않는 경우가 많으므로 구현은 정상적인 메서드 반환보다 인터럽트에 응답하는 것을 선호할 수 있습니다. 스레드 차단을 해제할 수 있는 다른 작업 후에 인터럽트 발생이 표시될 수 있는 경우에도 마찬가지입니다. 구현은 이 동작을 문서화해야 합니다.

1.5에 추가되었습니다.

에 대한 Java 설명서입니다 java.util.concurrent.locks.Condition.

이 페이지의 일부는 만들고 공유하며 에 설명된 조건에 따라 사용되는 작업을 기반으로 수정됩니다.

속성

Handle

기본 Android 개체의 JNI 값을 가져옵니다.

(다음에서 상속됨 IJavaObject)
JniIdentityHashCode

래핑된 instance 값을 반환 java.lang.System.identityHashCode() 합니다.

(다음에서 상속됨 IJavaPeerable)
JniManagedPeerState

관리되는 피어의 상태입니다.

(다음에서 상속됨 IJavaPeerable)
JniPeerMembers

멤버 액세스 및 호출 지원.

(다음에서 상속됨 IJavaPeerable)
PeerReference

JniObjectReference 래핑된 Java 개체 instance 의 를 반환합니다.

(다음에서 상속됨 IJavaPeerable)

메서드

Await()

현재 스레드가 신호를 보내거나 스레드#인터럽트 중단될 때까지 대기합니다.

Await(Int64, TimeUnit)

현재 스레드가 신호를 보내거나 중단되거나 지정된 대기 시간이 경과할 때까지 대기하도록 합니다.

AwaitNanos(Int64)

현재 스레드가 신호를 보내거나 중단되거나 지정된 대기 시간이 경과할 때까지 대기하도록 합니다.

AwaitUninterruptibly()

현재 스레드가 신호가 표시될 때까지 대기하도록 합니다.

AwaitUntil(Date)

현재 스레드가 신호 또는 중단되거나 지정된 기한이 경과할 때까지 대기하도록 합니다.

Disposed()

instance 삭제될 때 호출됩니다.

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

이 instance 대한 미해결 참조가 없으면 를 호출Dispose()합니다. 그렇지 않으면 아무 작업도 수행하지 않습니다.

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

instance 완료될 때 호출됩니다.

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

에서 반환 JniIdentityHashCode된 값을 설정합니다.

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

ConditionObject 는 모니터 메서드(Object#wait() waitObject#notify notifyObject#notifyAll notifyAll)를 고유한 개체로 변환하여 개체당 여러 대기 집합을 포함하는 효과를 주기 위해 임 Lock 의 구현을 사용하여 이를 결합합니다.

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

에서 반환 PeerReference된 값을 설정합니다.

(다음에서 상속됨 IJavaPeerable)
Signal()

대기 중인 스레드 하나를 깨워 줍니다.

SignalAll()

모든 대기 스레드를 해제합니다.

UnregisterFromRuntime()

런타임이 이후 Java.Interop.JniRuntime+JniValueManager.PeekValue 호출에서 반환되지 않도록 이 instance 등록을 취소합니다.

(다음에서 상속됨 IJavaPeerable)

확장 메서드

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

ConditionObject 는 모니터 메서드(Object#wait() waitObject#notify notifyObject#notifyAll notifyAll)를 고유한 개체로 변환하여 개체당 여러 대기 집합을 포함하는 효과를 주기 위해 임 Lock 의 구현을 사용하여 이를 결합합니다.

GetJniTypeName(IJavaPeerable)

ConditionObject 는 모니터 메서드(Object#wait() waitObject#notify notifyObject#notifyAll notifyAll)를 고유한 개체로 변환하여 개체당 여러 대기 집합을 포함하는 효과를 주기 위해 임 Lock 의 구현을 사용하여 이를 결합합니다.

적용 대상