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
の実装を使用してそれらを組み合わせることで、オブジェクトごとに複数の待機セットを持つ効果を与えます。 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<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>
を待機している場合は Condition
、&量子。<em>偽のウェイクアップ</em>" は、一般に、基になるプラットフォーム セマンティクスに対する譲歩として発生することが許可されています。 は常にループで待機し、待機中の状態述語をテストする必要があります Condition
。 実装は、誤ったウェイクアップの可能性を取り除くことができますが、アプリケーションプログラマは常にそれらが発生し、常にループで待つ可能性があると想定することをお勧めします。
条件待機の 3 つの形式 (割り込み可能、割り込み不可、および時間指定) は、一部のプラットフォームでの実装の容易さとパフォーマンス特性によって異なる場合があります。 特に、これらの機能を提供し、順序付けの保証などの特定のセマンティクスを維持することは困難な場合があります。 また、スレッドの実際の中断を中断する機能は、常にすべてのプラットフォームで実装できるとは限りません。
したがって、実装は、3 つのすべての形式の待機に対してまったく同じ保証またはセマンティクスを定義する必要はありません。また、スレッドの実際の中断の中断をサポートする必要もありません。
実装は、各待機メソッドによって提供されるセマンティクスと保証を明確に文書化するために必要です。実装でスレッド中断の中断がサポートされている場合は、このインターフェイスで定義されている中断セマンティクスに従う必要があります。
中断は一般にキャンセルを意味し、中断のチェックは頻繁に行われないので、実装では通常のメソッドの戻り値に対する割り込みに対する応答を優先できます。 これは、スレッドのブロックを解除した可能性のある別のアクションの後に割り込みが発生したことを示すことができる場合でも当てはまります。 実装では、この動作を文書化する必要があります。
1\.5 で追加されました。
の Java ドキュメント java.util.concurrent.locks.Condition
。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
プロパティ
Handle |
基になる Android オブジェクトの JNI 値を取得します。 (継承元 IJavaObject) |
JniIdentityHashCode |
ラップされたインスタンスの の |
JniManagedPeerState |
マネージド ピアの状態。 (継承元 IJavaPeerable) |
JniPeerMembers |
メンバー アクセスと呼び出しのサポート。 (継承元 IJavaPeerable) |
PeerReference |
JniObjectReferenceラップされた Java オブジェクト インスタンスの を返します。 (継承元 IJavaPeerable) |
メソッド
Await() |
現在のスレッドがシグナル通知されるか、Thread#割り込みが中断されるまで待機します。 |
Await(Int64, TimeUnit) |
現在のスレッドがシグナル化または中断されるか、指定された待機時間が経過するまで待機します。 |
AwaitNanos(Int64) |
現在のスレッドがシグナル化または中断されるか、指定された待機時間が経過するまで待機します。 |
AwaitUninterruptibly() |
現在のスレッドが通知されるまで待機します。 |
AwaitUntil(Date) |
現在のスレッドが通知または中断されるか、指定された期限が経過するまで待機します。 |
Disposed() |
インスタンスが破棄されたときに呼び出されます。 (継承元 IJavaPeerable) |
DisposeUnlessReferenced() |
このインスタンスへの未処理の参照がない場合は、 を呼び出 |
Finalized() |
インスタンスが終了したときに呼び出されます。 (継承元 IJavaPeerable) |
SetJniIdentityHashCode(Int32) |
によって返される値を |
SetJniManagedPeerState(JniManagedPeerStates) |
|
SetPeerReference(JniObjectReference) |
によって返される値を |
Signal() |
1 つの待機中のスレッドをウェイクアップします。 |
SignalAll() |
待機しているすべてのスレッドをウェイクアップします。 |
UnregisterFromRuntime() |
ランタイムが将来 Java.Interop.JniRuntime+JniValueManager.PeekValue の呼び出しから返されないように、このインスタンスの登録を解除します。 (継承元 IJavaPeerable) |
拡張メソッド
JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|