ICondition インターフェイス

定義

Condition では、 Object 監視メソッド (Object#wait() waitObject#notify notifyObject#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 notifyObject#notifyAll notifyAll) を個別のオブジェクトに組み込み、任意の Lock 実装の使用と組み合わせることで、オブジェクトごとに複数の待機セットを持つ効果を与えます。 Locksynchronizedメソッドとステートメントの使用を置き換える場合、Conditionはオブジェクト モニター メソッドの使用を置き換えます。

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

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

たとえば、 put メソッドと take メソッドをサポートする境界バッファーがあるとします。 空のバッファーで take が試行された場合、スレッドは項目が使用可能になるまでブロックされます。完全なバッファーで put が試行された場合、スレッドは領域が使用可能になるまでブロックされます。 項目またはスペースがバッファー内で使用可能になったときに 1 つのスレッドのみに通知する最適化を使用できるように、 put スレッドと take スレッドを個別の待機セットで待機し続けたいと考えています。 これは、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 waitメソッドとObject#notify notify メソッドを呼び出すことができます。 Condition インスタンスのモニター ロックの取得、またはその監視メソッドの使用には、そのConditionに関連付けられたLockの取得や、その #await 待機および #signal シグナル通知メソッドの使用との関係は指定されません。 混乱を避けるために、おそらく独自の実装内を除き、この方法で Condition インスタンスを使用しないことをお勧めします。

特に記載のない限り、パラメーターに null 値を渡すと、 NullPointerException がスローされます。

<h2>実装に関する考慮事項</h2>

Conditionを待機しているときは、><em>purious wakeup</em>> は、一般に、基になるプラットフォーム セマンティクスに対する譲歩として発生することが許可されています。 Conditionは常にループ内で待機し、待機中の状態述語をテストする必要があり、ほとんどのアプリケーション プログラムには実用的な影響はほとんどありません。 実装は、スプリアスウェイクアップの可能性を取り除くために自由ですが、アプリケーションプログラマは常にそれらが発生し、常にループで待つ可能性があると想定することをお勧めします。

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

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

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

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

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

Javaドキュメント。

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

プロパティ

名前 説明
Handle

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

(継承元 IJavaObject)
JniIdentityHashCode

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

(継承元 IJavaPeerable)
JniManagedPeerState

マネージド ピアの状態。

(継承元 IJavaPeerable)
JniPeerMembers

メンバー アクセスと呼び出しのサポート。

(継承元 IJavaPeerable)
PeerReference

ラップされたJava オブジェクト インスタンスのJniObjectReferenceを返します。

(継承元 IJavaPeerable)

メソッド

名前 説明
Await()

現在のスレッドが通知されるか、Thread#interrupt が中断されるまで待機します。

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 notifyObject#notifyAll notifyAll) を個別のオブジェクトに組み込み、任意の Lock 実装の使用と組み合わせることで、オブジェクトごとに複数の待機セットを持つ効果を与えます。

(継承元 IJavaPeerable)
SetPeerReference(JniObjectReference)

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

(継承元 IJavaPeerable)
Signal()

待機中のスレッドを 1 つ起動します。

SignalAll()

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

UnregisterFromRuntime()

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

(継承元 IJavaPeerable)

拡張メソッド

名前 説明
GetJniTypeName(IJavaPeerable)

インスタンス selfの型の JNI 名を取得します。

JavaAs<TResult>(IJavaPeerable)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

Condition では、 Object 監視メソッド (Object#wait() waitObject#notify notifyObject#notifyAll notifyAll) を個別のオブジェクトに組み込み、任意の Lock 実装の使用と組み合わせることで、オブジェクトごとに複数の待機セットを持つ効果を与えます。

TryJavaCast<TResult>(IJavaPeerable, TResult)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

適用対象