ICondition 介面
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
Condition
會將監視方法 (Object#notify notify
Object#wait() wait
和 Object#notifyAll notifyAll
) 因素納入Object
不同的物件,藉由結合它們與使用任意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#notify notify
Object#wait() wait
和 Object#notifyAll notifyAll
) 因素納入Object
不同的物件,藉由結合它們與使用任意Lock
實作,讓每個物件有多個等候集的效果。 其中, Lock
會取代 方法 synchronized
與語句的使用方式, Condition
取代使用 Object monitor 方法。
條件 (也稱為<em條件佇列</em>或 <em 條件變數</em>>) 提供一個方法,讓一個線程暫停執行 (以> &商數;等候&商;) 直到另一個線程通知,某些狀態條件現在可能為 true 為止。 由於此共享狀態資訊的存取發生在不同的線程中,因此必須受到保護,因此某些窗體的鎖定會與條件相關聯。 等候條件提供的索引鍵屬性是它會<>以不可部分完成的方式</em> 釋放相關聯的鎖定並暫停目前的線程,就像 一樣Object.wait
。
Condition
實例會以內部方式系結至鎖定。 若要取得 Condition
特定 Lock
實例的實例,請使用其 Lock#newCondition newCondition()
方法。
例如,假設我們有一個支援 和 take
方法的限定緩衝區put
。 如果在空緩衝區上嘗試 , take
則線程會封鎖直到專案變成可用為止;如果在完整緩衝區上嘗試 , put
則線程會封鎖直到空間變成可用為止。 我們想要將等候線程和take
線程保留在個別的等候put
集中,以便我們可以使用優化,一次只通知單一線程,當緩衝區中的專案或空間可用時。 這可以使用兩 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
方法。 取得實例的 Condition
監視鎖定或使用其監視方法,沒有與取得 Lock
相關聯的 Condition
或使用其 #await 等候和 #signal 訊號方法的指定關聯性。 建議您避免以這種方式使用 Condition
實例,但可能是在自己的實作中除外。
除非另有指定,否則傳遞 null
任何參數的值將會導致 NullPointerException
擲回 。
<h2>實作考慮</h2>
等候 Condition
時,&商;<假>性喚醒</em>&商;一般允許發生,就像基礎平臺語意的一樣。 這對大多數應用程式程序的影響很小,因為 Condition
應該一律在迴圈中等候,測試正在等候的狀態述詞。 實作是免費的,可移除假性喚醒的可能性,但建議應用程式程式設計人員一律假設它們可能發生,因此一律在迴圈中等候。
等候 (可中斷、不可中斷和計時) 的三種形式,可能會因某些平臺上的實作方式及其效能特性而有所不同。 特別是,提供這些功能並維護特定語意可能很困難,例如排序保證。 此外,中斷線程實際暫停的能力不一定會在所有平台上實作。
因此,實作不需要定義這三種等候形式完全相同的保證或語意,也不需要支援中斷線程的實際暫停。
實作必須清楚記錄每個等候方法所提供的語意和保證,而且當實作支援線程暫停中斷時,它必須遵守此介面中所定義的中斷語意。
由於中斷通常表示取消,而且通常不常檢查中斷,因此實作可能會偏好回應中斷,而非一般方法傳回。 即使可以顯示中斷發生在另一個可能解除封鎖線程的動作之後,也是如此。 實作應該記載此行為。
在 1.5 中新增。
的 java.util.concurrent.locks.Condition
Java 檔。
此頁面的部分是根據 所建立和共用的工作進行修改,並根據 2.5 屬性授權中所述的詞彙來使用。
屬性
Handle |
取得基礎 Android 物件的 JNI 值。 (繼承來源 IJavaObject) |
JniIdentityHashCode |
傳回已包裝實例的 值 |
JniManagedPeerState |
Managed 對等的狀態。 (繼承來源 IJavaPeerable) |
JniPeerMembers |
成員存取和調用支援。 (繼承來源 IJavaPeerable) |
PeerReference |
傳 JniObjectReference 回已包裝 Java 物件實例的 。 (繼承來源 IJavaPeerable) |
方法
Await() |
導致目前的線程等候,直到發出訊號或 Thread#中斷中斷為止。 |
Await(Int64, TimeUnit) |
讓目前的線程等待直到發出訊號或中斷,或指定的等候時間經過為止。 |
AwaitNanos(Int64) |
讓目前的線程等待直到發出訊號或中斷,或指定的等候時間經過為止。 |
AwaitUninterruptibly() |
導致目前的線程等候,直到發出訊號為止。 |
AwaitUntil(Date) |
讓目前的線程等到發出訊號或中斷,或指定的期限經過為止。 |
Disposed() |
處置實例時呼叫。 (繼承來源 IJavaPeerable) |
DisposeUnlessReferenced() |
如果這個實例沒有未完成的參考,則呼叫 |
Finalized() |
實例完成時呼叫。 (繼承來源 IJavaPeerable) |
SetJniIdentityHashCode(Int32) |
設定所 |
SetJniManagedPeerState(JniManagedPeerStates) |
|
SetPeerReference(JniObjectReference) |
設定所 |
Signal() |
喚醒一個等候中的線程。 |
SignalAll() |
喚醒所有等候中的線程。 |
UnregisterFromRuntime() |
取消註冊這個實例,讓運行時間不會從未來的 Java.Interop.JniRuntime+JniValueManager.PeekValue 調用傳回它。 (繼承來源 IJavaPeerable) |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|