ICondition 인터페이스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
Condition
Object
는 모니터 메서드(Object#wait() wait
및 Object#notify notify
Object#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
- 파생
- 특성
- 구현
설명
Condition
Object
는 모니터 메서드(Object#wait() wait
및 Object#notify notify
Object#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<E> {
<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 wait
및 Object#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 값을 반환 |
JniManagedPeerState |
관리되는 피어의 상태입니다. (다음에서 상속됨 IJavaPeerable) |
JniPeerMembers |
멤버 액세스 및 호출 지원. (다음에서 상속됨 IJavaPeerable) |
PeerReference |
JniObjectReference 래핑된 Java 개체 instance 의 를 반환합니다. (다음에서 상속됨 IJavaPeerable) |
메서드
Await() |
현재 스레드가 신호를 보내거나 스레드#인터럽트 중단될 때까지 대기합니다. |
Await(Int64, TimeUnit) |
현재 스레드가 신호를 보내거나 중단되거나 지정된 대기 시간이 경과할 때까지 대기하도록 합니다. |
AwaitNanos(Int64) |
현재 스레드가 신호를 보내거나 중단되거나 지정된 대기 시간이 경과할 때까지 대기하도록 합니다. |
AwaitUninterruptibly() |
현재 스레드가 신호가 표시될 때까지 대기하도록 합니다. |
AwaitUntil(Date) |
현재 스레드가 신호 또는 중단되거나 지정된 기한이 경과할 때까지 대기하도록 합니다. |
Disposed() |
instance 삭제될 때 호출됩니다. (다음에서 상속됨 IJavaPeerable) |
DisposeUnlessReferenced() |
이 instance 대한 미해결 참조가 없으면 를 호출 |
Finalized() |
instance 완료될 때 호출됩니다. (다음에서 상속됨 IJavaPeerable) |
SetJniIdentityHashCode(Int32) |
에서 반환 |
SetJniManagedPeerState(JniManagedPeerStates) |
|
SetPeerReference(JniObjectReference) |
에서 반환 |
Signal() |
대기 중인 스레드 하나를 깨워 줍니다. |
SignalAll() |
모든 대기 스레드를 해제합니다. |
UnregisterFromRuntime() |
런타임이 이후 Java.Interop.JniRuntime+JniValueManager.PeekValue 호출에서 반환되지 않도록 이 instance 등록을 취소합니다. (다음에서 상속됨 IJavaPeerable) |
확장 메서드
JavaCast<TResult>(IJavaObject) |
Android 런타임 확인 형식 변환을 수행합니다. |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|