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任意實作,營造出每個物件有多個等待集的效果。 其中 a Lock 取代了方法與語句的使用 synchronized ,a Condition 則取代了物件監控方法的使用。
條件(也稱為 <em>條件佇列</em> 或 <em>條件變數</em>)提供一種方式,讓一個執行緒可以暫停執行(暫停執行至 ”等等&)直到被其他執行緒通知,某個狀態條件現在可能為真。 由於對這些共享狀態資訊的存取發生在不同的執行緒中,必須受到保護,因此條件會綁定某種形式的鎖。 等待條件的關鍵特性是 <em>原子/<em> 釋放了相關的鎖並暫停當前執行緒,就像 Object.wait。
實 Condition 例本質上綁定於鎖。 要取得 Condition 特定 Lock 實例的實例,請使用其 Lock#newCondition newCondition() 方法。
舉例來說,假設我們有一個有界緩衝區,它支援 put 和 take 方法。 若 a take 嘗試在空緩衝區執行,執行緒會阻塞直到有項目可用;若 a 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 方法被調用。 取得實例的 Condition 監控鎖,或使用其監控方法,與取得 Lock 與 Condition 該實例相關的密碼或使用 #await 等待與 #signal 訊號方法並無明確關聯。 建議為避免混淆,除非在實例本身的實作中,否則切勿以此方式使用 Condition 實例。
除非另有說明,傳遞null任何參數的值都會導致拋出。NullPointerException
<h2>實作考量</h2>
當等待 Conditiona 時 a 與 quot;<>EM 虛假的 wakeup</em>“ 通常是為了讓步於底層平台語意而被允許。 這對大多數應用程式影響不大,因為應 Condition 始終以迴圈等待,測試等待的狀態謂詞。 實作可以自由消除虛假喚醒的可能性,但建議應用程式程式設計師始終假設喚醒可能發生,因此必須在迴圈中等待。
三種條件等待形式(可中斷、不可中斷及定時)在某些平台上的實作難易度及效能特性上可能有所不同。 特別是,提供這些功能並維持特定語意(如訂購保證)可能相當困難。 此外,中斷執行緒實際暫停的能力並非所有平台都能實現。
因此,實作不必對三種等待形式定義完全相同的保證或語意,也不必支援實際暫停執行緒的中斷。
實作必須清楚記錄每個等待方法所提供的語意與保證,當實作支援執行緒暫停中斷時,必須遵守此介面中定義的中斷語意。
由於中斷通常意味著取消,且中斷檢查通常不頻繁,實作可能偏好對中斷的回應而非一般方法回傳。 即使可以證明中斷發生在另一個可能解除阻塞執行緒的動作之後,這點依然成立。 實作應該記錄這種行為。
已在1.5中新增。
Java 文件 java.util.concurrent.locks.Condition。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
屬性
| 名稱 | Description |
|---|---|
| Handle |
取得底層 Android 物件的 JNI 值。 (繼承來源 IJavaObject) |
| JniIdentityHashCode |
回傳包裹實例的 |
| JniManagedPeerState |
管理貴族的狀況。 (繼承來源 IJavaPeerable) |
| JniPeerMembers |
成員存取與召喚支援。 (繼承來源 IJavaPeerable) |
| PeerReference |
回傳JniObjectReference包裹後的 Java 物件實例。 (繼承來源 IJavaPeerable) |
方法
| 名稱 | Description |
|---|---|
| Await() |
導致目前執行緒等待被通知或執行緒#中斷。 |
| 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) |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |