ICondition 介面

定義

Condition將監控方法Object(、 Object#wait() waitObject#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() waitObject#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() 方法。

舉例來說,假設我們有一個有界緩衝區,它支援 puttake 方法。 若 a take 嘗試在空緩衝區執行,執行緒會阻塞直到有項目可用;若 a 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 wait 器和 Object#notify notify 方法被調用。 取得實例的 Condition 監控鎖,或使用其監控方法,與取得 LockCondition 該實例相關的密碼或使用 #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

回傳包裹實例的 java.lang.System.identityHashCode() 值。

(繼承來源 IJavaPeerable)
JniManagedPeerState

管理貴族的狀況。

(繼承來源 IJavaPeerable)
JniPeerMembers

成員存取與召喚支援。

(繼承來源 IJavaPeerable)
PeerReference

回傳JniObjectReference包裹後的 Java 物件實例。

(繼承來源 IJavaPeerable)

方法

名稱 Description
Await()

導致目前執行緒等待被通知或執行緒#中斷。

Await(Int64, TimeUnit)

導致目前執行緒等待,直到收到訊號或中斷,或指定的等待時間結束。

AwaitNanos(Int64)

導致目前執行緒等待,直到收到訊號或中斷,或指定的等待時間結束。

AwaitUninterruptibly()

會讓目前的執行緒等待訊號。

AwaitUntil(Date)

導致目前執行緒等待被通知或中斷,或指定的截止期限過後才會進行。

Disposed()

當實例被處理後才被召喚。

(繼承來源 IJavaPeerable)
DisposeUnlessReferenced()

如果沒有未解決的參考資料,則 Dispose()呼叫;否則,則不做任何事。

(繼承來源 IJavaPeerable)
Finalized()

當實例完成後才會被通知。

(繼承來源 IJavaPeerable)
SetJniIdentityHashCode(Int32)

將回傳的值設為 JniIdentityHashCode

(繼承來源 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Condition將監控方法Object(、 Object#wait() waitObject#notify notify)分解Object#notifyAll notifyAll成獨立物件,藉由結合Lock任意實作,營造出每個物件有多個等待集的效果。

(繼承來源 IJavaPeerable)
SetPeerReference(JniObjectReference)

將回傳的值設為 PeerReference

(繼承來源 IJavaPeerable)
Signal()

喚醒一條等待的線索。

SignalAll()

喚醒所有等待的線索。

UnregisterFromRuntime()

取消註冊此實例,讓執行時不會在未來 Java.Interop.JniRuntime+JniValueManager.PeekValue 的呼叫中回傳該實例。

(繼承來源 IJavaPeerable)

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

Condition將監控方法Object(、 Object#wait() waitObject#notify notify)分解Object#notifyAll notifyAll成獨立物件,藉由結合Lock任意實作,營造出每個物件有多個等待集的效果。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於