ICondition Interfaccia

Definizione

Conditionfattori i Object metodi di monitoraggio (Object#wait() waitObject#notify notifye Object#notifyAll notifyAll) in oggetti distinti per dare l'effetto di avere più set di attesa per oggetto, combinandoli con l'uso di implementazioni arbitrarieLock.

[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
Derivato
Attributi
Implementazioni

Commenti

Conditionfattori i Object metodi di monitoraggio (Object#wait() waitObject#notify notifye Object#notifyAll notifyAll) in oggetti distinti per dare l'effetto di avere più set di attesa per oggetto, combinandoli con l'uso di implementazioni arbitrarieLock. Se un Lock oggetto sostituisce l'uso di synchronized metodi e istruzioni, sostituisce Condition l'uso dei metodi di monitoraggio object.

Condizioni (note anche come <code> di condizioni em</em> o <variabili> di condizione em</em>) forniscono un mezzo per un thread per sospendere l'esecuzione (a " wait") fino a quando non viene notificata da un altro thread che alcune condizioni di stato potrebbero ora essere vere. Poiché l'accesso a queste informazioni sullo stato condiviso si verifica in thread diversi, deve essere protetto, pertanto un blocco di una maschera è associato alla condizione. La proprietà chiave che in attesa di una condizione fornisce è che <em in>modo atomico</em> rilascia il blocco associato e sospende il thread corrente, proprio come Object.wait.

Un'istanza Condition è intrinsecamente associata a un blocco. Per ottenere un'istanza Condition di per una determinata Lock istanza, utilizzare il relativo Lock#newCondition newCondition() metodo.

Si supponga, ad esempio, di avere un buffer delimitato che supporta put i metodi e take . Se si tenta di eseguire un take tentativo in un buffer vuoto, il thread bloccherà fino a quando non diventa disponibile un elemento. Se put si tenta di eseguire un tentativo su un buffer completo, il thread bloccherà fino a quando non diventa disponibile uno spazio. Si desidera mantenere i thread e put i thread in attesa take in set di attesa separati, in modo da poter usare l'ottimizzazione della notifica di un singolo thread alla volta in cui gli elementi o gli spazi diventano disponibili nel buffer. A tale scopo, è possibile usare due Condition istanze.

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>
              }
            }

La java.util.concurrent.ArrayBlockingQueue classe fornisce questa funzionalità, pertanto non esiste alcun motivo per implementare questa classe di utilizzo di esempio.

Un'implementazione Condition può fornire un comportamento e una semantica diversa da quella dei metodi di monitoraggio, ad esempio l'ordinamento garantito per le notifiche o la mancata esecuzione di un blocco durante l'esecuzione Object delle notifiche. Se un'implementazione fornisce una semantica così specializzata, l'implementazione deve documentare tali semantiche.

Si noti che Condition le istanze sono solo oggetti normali e possono essere usate come destinazione in un'istruzione synchronized e possono avere un proprio monitoraggio Object#wait wait e Object#notify notify metodi richiamati. L'acquisizione del blocco di monitoraggio di un'istanza Condition o l'uso dei relativi metodi di monitoraggio non ha alcuna relazione specificata con l'acquisizione dell'oggetto associato a tale Lock oggetto o all'uso Condition del relativo #await metodi di attesa e #signal segnalazione. È consigliabile evitare confusione che non si usino Condition mai istanze in questo modo, tranne forse all'interno della propria implementazione.

Se non specificato, il passaggio di un null valore per qualsiasi parametro comporterà la creazione di un'eccezione NullPointerException .

<Considerazioni sull'implementazione> h2</h2>

In attesa di un Conditionoggetto , un "<em>spurious wakeup</em>" è autorizzato a verificarsi, in generale, come concessione alla semantica della piattaforma sottostante. Questo ha un impatto poco pratico sulla maggior parte dei programmi dell'applicazione perché Condition deve essere sempre aspettato in un ciclo, testando il predicato di stato che è in attesa. Un'implementazione è libera di rimuovere la possibilità di riattivazioni spurie, ma è consigliabile che i programmatori di applicazioni presuppongono sempre che possano verificarsi e quindi attendere sempre in un ciclo.

Le tre forme di attesa delle condizioni (interrompibili, non interrompibili e a tempo) possono differire nella facilità di implementazione in alcune piattaforme e nelle relative caratteristiche di prestazioni. In particolare, può essere difficile fornire queste funzionalità e mantenere una semantica specifica, ad esempio le garanzie di ordinamento. Inoltre, la possibilità di interrompere la sospensione effettiva del thread potrebbe non essere sempre fattibile da implementare su tutte le piattaforme.

Di conseguenza, un'implementazione non è necessaria per definire esattamente le stesse garanzie o semantiche per tutte e tre le forme di attesa, né è necessario supportare l'interruzione della sospensione effettiva del thread.

Un'implementazione è necessaria per documentare chiaramente la semantica e le garanzie fornite da ognuno dei metodi in attesa e quando un'implementazione supporta l'interruzione della sospensione del thread, deve rispettare la semantica di interruzione come definito in questa interfaccia.

Poiché l'interruzione implica in genere l'annullamento e i controlli per l'interruzione sono spesso poco frequenti, un'implementazione può favorire la risposta a un interrupt rispetto alla restituzione normale del metodo. Questo vale anche se può essere mostrato che l'interrupt si è verificato dopo un'altra azione che potrebbe aver sbloccato il thread. Un'implementazione deve documentare questo comportamento.

Aggiunto nella versione 1.5.

per java.util.concurrent.locks.Condition.

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dalla e usati in base ai termini descritti in Creative License 2.5 Attribution License.

Proprietà

Nome Descrizione
Handle

Ottiene il valore JNI dell'oggetto Android sottostante.

(Ereditato da IJavaObject)
JniIdentityHashCode

Restituisce il valore di java.lang.System.identityHashCode() per l'istanza di cui è stato eseguito il wrapping.

(Ereditato da IJavaPeerable)
JniManagedPeerState

Stato del peer gestito.

(Ereditato da IJavaPeerable)
JniPeerMembers

Supporto per l'accesso ai membri e la chiamata.

(Ereditato da IJavaPeerable)
PeerReference

Restituisce un JniObjectReference oggetto dell'istanza dell'oggetto di cui è stato eseguito il wrapping Java.

(Ereditato da IJavaPeerable)

Metodi

Nome Descrizione
Await()

Fa sì che il thread corrente attenda finché non viene segnalato o thread#interrupt interrotto.

Await(Int64, TimeUnit)

Fa sì che il thread corrente attenda finché non viene segnalato o interrotto o trascorso il tempo di attesa specificato.

AwaitNanos(Int64)

Fa sì che il thread corrente attenda finché non viene segnalato o interrotto o trascorso il tempo di attesa specificato.

AwaitUninterruptibly()

Fa sì che il thread corrente attenda finché non viene segnalato.

AwaitUntil(Date)

Fa in modo che il thread corrente attenda finché non viene segnalato o interrotto o scade la scadenza specificata.

Disposed()

Chiamato quando l'istanza è stata eliminata.

(Ereditato da IJavaPeerable)
DisposeUnlessReferenced()

Se non sono presenti riferimenti in sospeso a questa istanza, chiama Dispose(); in caso contrario, non esegue alcuna operazione.

(Ereditato da IJavaPeerable)
Finalized()

Chiamato quando l'istanza è stata finalizzata.

(Ereditato da IJavaPeerable)
SetJniIdentityHashCode(Int32)

Impostare il valore restituito da JniIdentityHashCode.

(Ereditato da IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Conditionfattori i Object metodi di monitoraggio (Object#wait() waitObject#notify notifye Object#notifyAll notifyAll) in oggetti distinti per dare l'effetto di avere più set di attesa per oggetto, combinandoli con l'uso di implementazioni arbitrarieLock.

(Ereditato da IJavaPeerable)
SetPeerReference(JniObjectReference)

Impostare il valore restituito da PeerReference.

(Ereditato da IJavaPeerable)
Signal()

Riattiva un thread in attesa.

SignalAll()

Riattiva tutti i thread in attesa.

UnregisterFromRuntime()

Annullare la registrazione di questa istanza in modo che il runtime non lo restituisca dalle chiamate future Java.Interop.JniRuntime+JniValueManager.PeekValue .

(Ereditato da IJavaPeerable)

Metodi di estensione

Nome Descrizione
GetJniTypeName(IJavaPeerable)

Ottiene il nome JNI del tipo dell'istanza selfdi .

JavaAs<TResult>(IJavaPeerable)

Provare a digitare selfTResult, verificando che la coercizione sia valida sul lato Java.

JavaCast<TResult>(IJavaObject)

Esegue una conversione del tipo di tipo controllato dal runtime Android.

JavaCast<TResult>(IJavaObject)

Conditionfattori i Object metodi di monitoraggio (Object#wait() waitObject#notify notifye Object#notifyAll notifyAll) in oggetti distinti per dare l'effetto di avere più set di attesa per oggetto, combinandoli con l'uso di implementazioni arbitrarieLock.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Provare a digitare selfTResult, verificando che la coercizione sia valida sul lato Java.

Si applica a