Share via


ICondition 介面

定義

Condition會將監視方法 (Object#notify notifyObject#wait() waitObject#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 notifyObject#wait() waitObject#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&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 方法。 取得實例的 Condition 監視鎖定或使用其監視方法,沒有與取得 Lock 相關聯的 Condition 或使用其 #await 等候和 #signal 訊號方法的指定關聯性。 建議您避免以這種方式使用 Condition 實例,但可能是在自己的實作中除外。

除非另有指定,否則傳遞 null 任何參數的值將會導致 NullPointerException 擲回 。

<h2>實作考慮</h2>

等候 Condition時,&商;<假>性喚醒</em>&商;一般允許發生,就像基礎平臺語意的一樣。 這對大多數應用程式程序的影響很小,因為 Condition 應該一律在迴圈中等候,測試正在等候的狀態述詞。 實作是免費的,可移除假性喚醒的可能性,但建議應用程式程式設計人員一律假設它們可能發生,因此一律在迴圈中等候。

等候 (可中斷、不可中斷和計時) 的三種形式,可能會因某些平臺上的實作方式及其效能特性而有所不同。 特別是,提供這些功能並維護特定語意可能很困難,例如排序保證。 此外,中斷線程實際暫停的能力不一定會在所有平台上實作。

因此,實作不需要定義這三種等候形式完全相同的保證或語意,也不需要支援中斷線程的實際暫停。

實作必須清楚記錄每個等候方法所提供的語意和保證,而且當實作支援線程暫停中斷時,它必須遵守此介面中所定義的中斷語意。

由於中斷通常表示取消,而且通常不常檢查中斷,因此實作可能會偏好回應中斷,而非一般方法傳回。 即使可以顯示中斷發生在另一個可能解除封鎖線程的動作之後,也是如此。 實作應該記載此行為。

在 1.5 中新增。

java.util.concurrent.locks.ConditionJava 檔。

此頁面的部分是根據 所建立和共用的工作進行修改,並根據 2.5 屬性授權中所述的詞彙來使用。

屬性

Handle

取得基礎 Android 物件的 JNI 值。

(繼承來源 IJavaObject)
JniIdentityHashCode

傳回已包裝實例的 值 java.lang.System.identityHashCode()

(繼承來源 IJavaPeerable)
JniManagedPeerState

Managed 對等的狀態。

(繼承來源 IJavaPeerable)
JniPeerMembers

成員存取和調用支援。

(繼承來源 IJavaPeerable)
PeerReference

JniObjectReference 回已包裝 Java 物件實例的 。

(繼承來源 IJavaPeerable)

方法

Await()

導致目前的線程等候,直到發出訊號或 Thread#中斷中斷為止。

Await(Int64, TimeUnit)

讓目前的線程等待直到發出訊號或中斷,或指定的等候時間經過為止。

AwaitNanos(Int64)

讓目前的線程等待直到發出訊號或中斷,或指定的等候時間經過為止。

AwaitUninterruptibly()

導致目前的線程等候,直到發出訊號為止。

AwaitUntil(Date)

讓目前的線程等到發出訊號或中斷,或指定的期限經過為止。

Disposed()

處置實例時呼叫。

(繼承來源 IJavaPeerable)
DisposeUnlessReferenced()

如果這個實例沒有未完成的參考,則呼叫 Dispose(),否則不會執行任何動作。

(繼承來源 IJavaPeerable)
Finalized()

實例完成時呼叫。

(繼承來源 IJavaPeerable)
SetJniIdentityHashCode(Int32)

設定所 JniIdentityHashCode傳回的值。

(繼承來源 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Condition會將監視方法 (Object#notify notifyObject#wait() waitObject#notifyAll notifyAll) 因素納入Object不同的物件,藉由結合它們與使用任意Lock實作,讓每個物件有多個等候集的效果。

(繼承來源 IJavaPeerable)
SetPeerReference(JniObjectReference)

設定所 PeerReference傳回的值。

(繼承來源 IJavaPeerable)
Signal()

喚醒一個等候中的線程。

SignalAll()

喚醒所有等候中的線程。

UnregisterFromRuntime()

取消註冊這個實例,讓運行時間不會從未來的 Java.Interop.JniRuntime+JniValueManager.PeekValue 調用傳回它。

(繼承來源 IJavaPeerable)

擴充方法

JavaCast<TResult>(IJavaObject)

執行 Android 執行時間檢查的類型轉換。

JavaCast<TResult>(IJavaObject)

Condition會將監視方法 (Object#notify notifyObject#wait() waitObject#notifyAll notifyAll) 因素納入Object不同的物件,藉由結合它們與使用任意Lock實作,讓每個物件有多個等候集的效果。

GetJniTypeName(IJavaPeerable)

Condition會將監視方法 (Object#notify notifyObject#wait() waitObject#notifyAll notifyAll) 因素納入Object不同的物件,藉由結合它們與使用任意Lock實作,讓每個物件有多個等候集的效果。

適用於