ICondition インターフェイス

定義

ConditionObjectでは、モニター メソッド (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
派生
属性
実装

注釈

ConditionObjectでは、モニター メソッド (Object#wait() waitObject#notify notifyおよび Object#notifyAll notifyAll) を個別のオブジェクトに分解し、任意Lockの実装を使用してそれらを組み合わせることで、オブジェクトごとに複数の待機セットを持つ効果を与えます。 Lockがメソッドとステートメントのsynchronized使用を置き換える場合、 Condition は Object モニター メソッドの使用を置き換えます。

条件 (em 条件キュー</em>> または <em>条件変数</em> とも呼ばれます<) は、1 つのスレッドが実行を中断するための手段を提供します (quot を &するため)。wait")ある状態条件が true になる可能性があることを別のスレッドから通知されるまで。 この共有状態情報へのアクセスは異なるスレッドで行われるため、保護する必要があるため、何らかのフォームのロックが条件に関連付けられます。 条件を待機する主なプロパティは、<>関連付けられたロックをアトミック/em> で解放し、 と同様Object.waitに<現在のスレッドを中断することです。

Conditionインスタンスは本質的にロックにバインドされます。 特定LockのインスタンスのインスタンスをCondition取得するには、そのメソッドをLock#newCondition newCondition()使用します。

たとえば、 メソッドと take メソッドをサポートputする境界バッファーがあるとします。 takeが空のバッファーで試行されると、アイテムが使用可能になるまでスレッドはブロックされます。完全なバッファーで が試行された場合put、スレッドは領域が使用可能になるまでブロックされます。 待機中のスレッドとtakeスレッドをput別々の待機セットに保持して、バッファー内の項目またはスペースが使用可能になったときに 1 つのスレッドのみを通知するという最適化を使用できるようにしたいと考えます。 これは、2 つの 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>偽のウェイクアップ</em>" は、一般に、基になるプラットフォーム セマンティクスに対する譲歩として発生することが許可されています。 は常にループで待機し、待機中の状態述語をテストする必要があります Condition 。 実装は、誤ったウェイクアップの可能性を取り除くことができますが、アプリケーションプログラマは常にそれらが発生し、常にループで待つ可能性があると想定することをお勧めします。

条件待機の 3 つの形式 (割り込み可能、割り込み不可、および時間指定) は、一部のプラットフォームでの実装の容易さとパフォーマンス特性によって異なる場合があります。 特に、これらの機能を提供し、順序付けの保証などの特定のセマンティクスを維持することは困難な場合があります。 また、スレッドの実際の中断を中断する機能は、常にすべてのプラットフォームで実装できるとは限りません。

したがって、実装は、3 つのすべての形式の待機に対してまったく同じ保証またはセマンティクスを定義する必要はありません。また、スレッドの実際の中断の中断をサポートする必要もありません。

実装は、各待機メソッドによって提供されるセマンティクスと保証を明確に文書化するために必要です。実装でスレッド中断の中断がサポートされている場合は、このインターフェイスで定義されている中断セマンティクスに従う必要があります。

中断は一般にキャンセルを意味し、中断のチェックは頻繁に行われないので、実装では通常のメソッドの戻り値に対する割り込みに対する応答を優先できます。 これは、スレッドのブロックを解除した可能性のある別のアクションの後に割り込みが発生したことを示すことができる場合でも当てはまります。 実装では、この動作を文書化する必要があります。

1\.5 で追加されました。

の Java ドキュメント java.util.concurrent.locks.Condition

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

プロパティ

Handle

基になる Android オブジェクトの JNI 値を取得します。

(継承元 IJavaObject)
JniIdentityHashCode

ラップされたインスタンスの の java.lang.System.identityHashCode() 値を返します。

(継承元 IJavaPeerable)
JniManagedPeerState

マネージド ピアの状態。

(継承元 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)

ConditionObjectでは、モニター メソッド (Object#wait() waitObject#notify notifyおよび Object#notifyAll notifyAll) を個別のオブジェクトに分解し、任意Lockの実装を使用してそれらを組み合わせることで、オブジェクトごとに複数の待機セットを持つ効果を与えます。

(継承元 IJavaPeerable)
SetPeerReference(JniObjectReference)

によって返される値を PeerReference設定します。

(継承元 IJavaPeerable)
Signal()

1 つの待機中のスレッドをウェイクアップします。

SignalAll()

待機しているすべてのスレッドをウェイクアップします。

UnregisterFromRuntime()

ランタイムが将来 Java.Interop.JniRuntime+JniValueManager.PeekValue の呼び出しから返されないように、このインスタンスの登録を解除します。

(継承元 IJavaPeerable)

拡張メソッド

JavaCast<TResult>(IJavaObject)

Android ランタイムチェック型変換を実行します。

JavaCast<TResult>(IJavaObject)

ConditionObjectでは、モニター メソッド (Object#wait() waitObject#notify notifyおよび Object#notifyAll notifyAll) を個別のオブジェクトに分解し、任意Lockの実装を使用してそれらを組み合わせることで、オブジェクトごとに複数の待機セットを持つ効果を与えます。

GetJniTypeName(IJavaPeerable)

ConditionObjectでは、モニター メソッド (Object#wait() waitObject#notify notifyおよび Object#notifyAll notifyAll) を個別のオブジェクトに分解し、任意Lockの実装を使用してそれらを組み合わせることで、オブジェクトごとに複数の待機セットを持つ効果を与えます。

適用対象