ICondition Antarmuka

Definisi

Condition memperhitungkan Object metode pemantauan (Object#wait() wait, Object#notify notify dan Object#notifyAll notifyAll) ke dalam objek yang berbeda untuk memberikan efek memiliki beberapa set tunggu per objek, dengan menggabungkannya dengan penggunaan implementasi sewenang-wenang 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
Turunan
Atribut
Penerapan

Keterangan

Condition memperhitungkan Object metode pemantauan (Object#wait() wait, Object#notify notify dan Object#notifyAll notifyAll) ke dalam objek yang berbeda untuk memberikan efek memiliki beberapa set tunggu per objek, dengan menggabungkannya dengan penggunaan implementasi sewenang-wenang Lock . Lock Di mana menggantikan penggunaan synchronized metode dan pernyataan, menggantikan Condition penggunaan metode Monitor objek.

Kondisi (juga dikenal sebagai <kondisi em>antrean</em> atau <variabel> kondisi em</em>) menyediakan sarana bagi satu utas untuk menangguhkan eksekusi (ke " tunggu &) hingga diberi tahu oleh utas lain bahwa beberapa kondisi status sekarang mungkin benar. Karena akses ke informasi status bersama ini terjadi di utas yang berbeda, itu harus dilindungi, sehingga kunci beberapa formulir dikaitkan dengan kondisi. Properti kunci yang menunggu kondisi menyediakan adalah bahwa mereka <>secara atomik</em> melepaskan kunci terkait dan menangguhkan utas saat ini, seperti Object.wait.

Instans Condition secara intrinsik terikat pada kunci. Untuk mendapatkan Condition instans untuk instans tertentu Lock , gunakan metodenya Lock#newCondition newCondition() .

Sebagai contoh, misalkan kita memiliki buffer terikat yang mendukung put dan take metode. take Jika dicoba pada buffer kosong, maka utas akan memblokir hingga item tersedia; jika put dicoba pada buffer penuh, maka utas akan memblokir hingga spasi tersedia. Kami ingin tetap menunggu put utas dan take utas dalam set tunggu terpisah sehingga kami dapat menggunakan pengoptimalan hanya memberi tahu satu utas pada saat item atau spasi tersedia di buffer. Ini dapat dicapai menggunakan dua Condition instans.

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

(Kelas java.util.concurrent.ArrayBlockingQueue menyediakan fungsionalitas ini, jadi tidak ada alasan untuk menerapkan kelas penggunaan sampel ini.)

Condition Implementasi dapat memberikan perilaku dan semantik yang berbeda dari Object metode pemantauan, seperti pengurutan yang dijamin untuk pemberitahuan, atau tidak memerlukan kunci untuk ditahan saat melakukan pemberitahuan. Jika implementasi menyediakan semantik khusus tersebut, maka implementasinya harus mendokumenkan semantik tersebut.

Perhatikan bahwa Condition instans hanyalah objek normal dan dapat digunakan sebagai target dalam pernyataan synchronized , dan dapat memiliki pemantauan Object#wait wait dan Object#notify notify metode mereka sendiri yang dipanggil. Memperoleh kunci Condition monitor instans, atau menggunakan metode pemantauannya, tidak memiliki hubungan yang ditentukan dengan memperoleh Lock yang terkait dengan itu Condition atau penggunaan metode sinyal #await menunggu dan #signal. Disarankan agar untuk menghindari kebingungan Anda tidak pernah menggunakan Condition instans dengan cara ini, kecuali mungkin dalam implementasi mereka sendiri.

Kecuali jika dicatat, meneruskan null nilai untuk parameter apa pun akan mengakibatkan NullPointerException dilemparkan.

<h2>Pertimbangan< Implementasi/h2>

Ketika menunggu Condition, a "<em>spurious wakeup</em"> diizinkan untuk terjadi, secara umum, sebagai konsesi pada semantik platform yang mendasar. Ini memiliki sedikit dampak praktis pada sebagian besar program aplikasi sebagai Condition harus selalu ditunggu dalam perulangan, menguji predikat status yang sedang ditunggu. Implementasi bebas untuk menghapus kemungkinan bangun yang memacu tetapi disarankan agar pemrogram aplikasi selalu berasumsi bahwa mereka dapat terjadi dan selalu menunggu dalam perulangan.

Tiga bentuk kondisi menunggu (dapat diinterupsi, tidak dapat diinterupsi, dan berwaktur) dapat berbeda dalam kemudahan implementasinya pada beberapa platform dan dalam karakteristik performanya. Secara khusus, mungkin sulit untuk menyediakan fitur-fitur ini dan mempertahankan semantik tertentu seperti jaminan pemesanan. Selanjutnya, kemampuan untuk mengganggu penangguhan aktual utas mungkin tidak selalu layak untuk diterapkan pada semua platform.

Akibatnya, implementasi tidak diperlukan untuk menentukan jaminan atau semantik yang sama persis untuk ketiga bentuk penantian, juga tidak diperlukan untuk mendukung gangguan penangguhan aktual utas.

Implementasi diperlukan untuk mendokumentasikan dengan jelas semantik dan jaminan yang disediakan oleh masing-masing metode tunggu, dan ketika implementasi mendukung gangguan penangguhan utas maka harus mematuhi semantik gangguan seperti yang didefinisikan dalam antarmuka ini.

Karena gangguan umumnya menyiratkan pembatalan, dan pemeriksaan gangguan sering jarang terjadi, implementasi dapat mendukung respons terhadap gangguan atas pengembalian metode normal. Ini benar bahkan jika dapat ditunjukkan bahwa gangguan terjadi setelah tindakan lain yang mungkin telah membuka blokir utas. Implementasi harus mendokumen perilaku ini.

Ditambahkan dalam 1.5.

Java dokumentasi untuk java.util.concurrent.locks.Condition.

Bagian dari halaman ini adalah modifikasi berdasarkan pekerjaan yang dibuat dan dibagikan oleh Android Open Source Project dan digunakan sesuai dengan istilah yang dijelaskan dalam Lisensi Creative Commons 2.5 Lisensi Atribusi.

Properti

Nama Deskripsi
Handle

Mendapatkan nilai JNI dari objek Android yang mendasar.

(Diperoleh dari IJavaObject)
JniIdentityHashCode

Mengembalikan nilai java.lang.System.identityHashCode() untuk instans yang dibungkus.

(Diperoleh dari IJavaPeerable)
JniManagedPeerState

Status serekan terkelola.

(Diperoleh dari IJavaPeerable)
JniPeerMembers

Akses anggota dan dukungan pemanggilan.

(Diperoleh dari IJavaPeerable)
PeerReference

Mengembalikan instans objek Java yang dibungkusJniObjectReference.

(Diperoleh dari IJavaPeerable)

Metode

Nama Deskripsi
Await()

Menyebabkan utas saat ini menunggu hingga disinyalir atau Thread#interrupt terganggu.

Await(Int64, TimeUnit)

Menyebabkan utas saat ini menunggu hingga disinyalir atau terganggu, atau waktu tunggu yang ditentukan berlalu.

AwaitNanos(Int64)

Menyebabkan utas saat ini menunggu hingga disinyalir atau terganggu, atau waktu tunggu yang ditentukan berlalu.

AwaitUninterruptibly()

Menyebabkan utas saat ini menunggu sampai disinyalir.

AwaitUntil(Date)

Menyebabkan utas saat ini menunggu hingga disinyalir atau terganggu, atau tenggat waktu yang ditentukan berlalu.

Disposed()

Dipanggil ketika instans telah dibuang.

(Diperoleh dari IJavaPeerable)
DisposeUnlessReferenced()

Jika tidak ada referensi yang luar biasa untuk instans ini, maka panggilan Dispose(); jika tidak, tidak melakukan apa pun.

(Diperoleh dari IJavaPeerable)
Finalized()

Dipanggil ketika instans telah diselesaikan.

(Diperoleh dari IJavaPeerable)
SetJniIdentityHashCode(Int32)

Atur nilai yang dikembalikan oleh JniIdentityHashCode.

(Diperoleh dari IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Condition memperhitungkan Object metode pemantauan (Object#wait() wait, Object#notify notify dan Object#notifyAll notifyAll) ke dalam objek yang berbeda untuk memberikan efek memiliki beberapa set tunggu per objek, dengan menggabungkannya dengan penggunaan implementasi sewenang-wenang Lock .

(Diperoleh dari IJavaPeerable)
SetPeerReference(JniObjectReference)

Atur nilai yang dikembalikan oleh PeerReference.

(Diperoleh dari IJavaPeerable)
Signal()

Bangun satu utas tunggu.

SignalAll()

Bangunkan semua alur tunggu.

UnregisterFromRuntime()

Batalkan pendaftaran instans ini sehingga runtime tidak akan mengembalikannya dari pemanggilan di masa mendatang Java.Interop.JniRuntime+JniValueManager.PeekValue .

(Diperoleh dari IJavaPeerable)

Metode Ekstensi

Nama Deskripsi
GetJniTypeName(IJavaPeerable)

Mendapatkan nama JNI dari jenis instans self.

JavaAs<TResult>(IJavaPeerable)

Cobalah untuk memaksa self untuk mengetik TResult, memeriksa bahwa paksaan valid di sisi Java.

JavaCast<TResult>(IJavaObject)

Melakukan konversi jenis yang diperiksa runtime Android.

JavaCast<TResult>(IJavaObject)

Condition memperhitungkan Object metode pemantauan (Object#wait() wait, Object#notify notify dan Object#notifyAll notifyAll) ke dalam objek yang berbeda untuk memberikan efek memiliki beberapa set tunggu per objek, dengan menggabungkannya dengan penggunaan implementasi sewenang-wenang Lock .

TryJavaCast<TResult>(IJavaPeerable, TResult)

Cobalah untuk memaksa self untuk mengetik TResult, memeriksa bahwa paksaan valid di sisi Java.

Berlaku untuk