Phaser Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan CyclicBarrier dan CountDownLatch tetapi mendukung penggunaan yang lebih fleksibel.
[Android.Runtime.Register("java/util/concurrent/Phaser", DoNotGenerateAcw=true)]
public class Phaser : Java.Lang.Object
[<Android.Runtime.Register("java/util/concurrent/Phaser", DoNotGenerateAcw=true)>]
type Phaser = class
inherit Object
- Warisan
- Atribut
Keterangan
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan CyclicBarrier dan CountDownLatch tetapi mendukung penggunaan yang lebih fleksibel.
<b>Pendaftaran.</b> Tidak seperti kasus untuk hambatan lain, jumlah pihak <yang didaftarkan>/em> untuk disinkronkan< pada phaser dapat bervariasi dari waktu ke waktu. Tugas dapat didaftarkan kapan saja (menggunakan metode #register, , #bulkRegisteratau bentuk konstruktor yang menetapkan jumlah awal pihak), dan secara opsional didaftarkan pada setiap kedatangan (menggunakan #arriveAndDeregister). Seperti halnya dengan sebagian besar konstruksi sinkronisasi dasar, pendaftaran dan deregistrasi hanya memengaruhi jumlah internal; mereka tidak menetapkan pembukuan internal lebih lanjut, sehingga tugas tidak dapat meminta apakah mereka terdaftar. (Namun, Anda dapat memperkenalkan pembukuan tersebut dengan subkelas kelas ini.)
<b>Sinkronisasi.</b> Seperti CyclicBarrier, mungkin Phaser berulang kali ditunggu. Metode #arriveAndAwaitAdvance memiliki efek yang dianalogikan dengan java.util.concurrent.CyclicBarrier#await CyclicBarrier.await. Setiap generasi phaser memiliki nomor fase terkait. Nomor fase dimulai pada nol, dan maju ketika semua pihak tiba di phaser, membungkus menjadi nol setelah mencapai Integer.MAX_VALUE. Penggunaan nomor fase memungkinkan kontrol tindakan independen pada saat kedatangan di phaser dan setelah menunggu orang lain, melalui dua jenis metode yang dapat dipanggil oleh pihak terdaftar mana pun:
<Ul>
<li><b>Kedatangan.</b> Metode #arrive dan #arriveAndDeregister mencatat kedatangan. Metode ini tidak memblokir, tetapi mengembalikan nomor</em> fase kedatangan terkait<>; yaitu, nomor fase phaser tempat kedatangan diterapkan. Ketika pihak akhir untuk fase tertentu tiba, tindakan opsional dilakukan dan fase maju. Tindakan ini dilakukan oleh pihak yang memicu kemajuan fase, dan diatur dengan mengambil alih metode #onAdvance(int, int), yang juga mengontrol penghentian. Mengambil alih metode ini mirip dengan, tetapi lebih fleksibel daripada, memberikan tindakan penghambat ke CyclicBarrier.
<li><b>Menunggu.</b> Metode #awaitAdvance memerlukan argumen yang menunjukkan nomor fase kedatangan, dan mengembalikan ketika phaser maju ke (atau sudah pada) fase yang berbeda. Tidak seperti konstruksi serupa yang menggunakan CyclicBarriermetode awaitAdvance , terus menunggu bahkan jika utas tunggu terganggu. Versi interupsi dan waktu habis juga tersedia, tetapi pengecualian yang dihadapi saat tugas menunggu secara interupsi atau dengan batas waktu tidak mengubah status phaser. Jika perlu, Anda dapat melakukan pemulihan terkait dalam penangan pengecualian tersebut, sering kali setelah memanggil forceTermination. Phasers juga dapat digunakan oleh tugas yang dijalankan dalam ForkJoinPool. Kemajuan dipastikan jika tingkat paralelisme kumpulan dapat mengakomodasi jumlah maksimum pihak yang diblokir secara bersamaan.
</Ul>
<b>Penghentian.</b> A phaser dapat memasuki <status em>penghentian</em> , yang dapat diperiksa menggunakan metode #isTerminated. Setelah penghentian, semua metode sinkronisasi segera kembali tanpa menunggu terlebih dahulu, seperti yang ditunjukkan oleh nilai pengembalian negatif. Demikian pula, upaya untuk mendaftar setelah penghentian tidak berpengaruh. Penghentian dipicu ketika pemanggilan onAdvance pengembalian true. Implementasi default mengembalikan true jika deregistrasi telah menyebabkan jumlah pihak terdaftar menjadi nol. Seperti yang diilustrasikan di bawah ini, ketika fase mengontrol tindakan dengan jumlah iterasi tetap, seringkali lebih mudah untuk mengambil alih metode ini untuk menyebabkan penghentian ketika nomor fase saat ini mencapai ambang batas. Metode #forceTermination ini juga tersedia untuk secara tiba-tiba melepaskan utas tunggu dan memungkinkannya untuk dihentikan.
<b>Tingkatan.</b> Phasers mungkin <em>berjenjang</em> (yaitu, dibangun dalam struktur pohon) untuk mengurangi pertikaian. Phaser dengan sejumlah besar pihak yang akan mengalami biaya pertikaian sinkronisasi berat dapat disiapkan sebagai gantinya sehingga kelompok sub-fase berbagi induk umum. Ini dapat sangat meningkatkan throughput meskipun menimbulkan overhead per operasi yang lebih besar.
Di pohon phaser berjenjang, pendaftaran dan deregistrasi phaser anak dengan induknya dikelola secara otomatis. Setiap kali jumlah pihak terdaftar dari phaser anak menjadi bukan nol (seperti yang ditetapkan dalam #Phaser(Phaser,int) konstruktor, #register, atau #bulkRegister), phaser turunan terdaftar di induknya. Setiap kali jumlah pihak terdaftar menjadi nol sebagai akibat dari pemanggilan , phaser turunan #arriveAndDeregisterdidaftarkan dari induknya.
<b>Pemantauan.</b> Meskipun metode sinkronisasi hanya dapat dipanggil oleh pihak terdaftar, status phaser saat ini dapat dipantau oleh pemanggil apa pun. Pada saat tertentu ada #getRegisteredParties pihak secara total, yang #getArrivedParties telah tiba pada fase saat ini (#getPhase). (Maka apabila telah tiba waktunya) saatnya (#getUnarrivedPartiesorang-orang yang berpenyakar) yaitu orang-orang. Nilai yang dikembalikan oleh metode ini dapat mencerminkan status sementara dan tidak secara umum berguna untuk kontrol sinkronisasi. Metode #toString mengembalikan rekam jepret dari kueri status ini dalam bentuk yang nyaman untuk pemantauan informal.
Efek konsistensi memori: Tindakan sebelum segala bentuk metode <kedatangan saya>terjadi sebelum</i> fase lanjutan yang sesuai dan tindakan onAdvance (jika ada), yang pada gilirannya terjadi sebelum tindakan setelah fase lanjutan.
<b>Penggunaan sampel:</b>
Phaser dapat digunakan alih-alih CountDownLatch untuk mengontrol tindakan satu bidikan yang melayani sejumlah pihak variabel. Idiom khas adalah untuk metode pengaturan ini ke register pertama, lalu mulai semua tindakan, lalu batalkan pendaftaran, seperti dalam:
{@code
void runTasks(List<Runnable> tasks) {
Phaser startingGate = new Phaser(1); // "1" to register self
// create and start threads
for (Runnable task : tasks) {
startingGate.register();
new Thread(() -> {
startingGate.arriveAndAwaitAdvance();
task.run();
}).start();
}
// deregister self to allow threads to proceed
startingGate.arriveAndDeregister();
}}
Salah satu cara untuk menyebabkan serangkaian utas berulang kali melakukan tindakan untuk sejumlah iterasi tertentu adalah dengan mengambil alih onAdvance:
{@code
void startTasks(List<Runnable> tasks, int iterations) {
Phaser phaser = new Phaser() {
protected boolean onAdvance(int phase, int registeredParties) {
return phase >= iterations - 1 || registeredParties == 0;
}
};
phaser.register();
for (Runnable task : tasks) {
phaser.register();
new Thread(() -> {
do {
task.run();
phaser.arriveAndAwaitAdvance();
} while (!phaser.isTerminated());
}).start();
}
// allow threads to proceed; don't wait for them
phaser.arriveAndDeregister();
}}
Jika tugas utama nantinya harus menunggu penghentian, tugas tersebut dapat mendaftar ulang dan kemudian menjalankan perulangan serupa:
{@code
// ...
phaser.register();
while (!phaser.isTerminated())
phaser.arriveAndAwaitAdvance();}
Konstruksi terkait dapat digunakan untuk menunggu nomor fase tertentu dalam konteks di mana Anda yakin bahwa fase tidak akan pernah membungkus Integer.MAX_VALUE. Contohnya:
{@code
void awaitPhase(Phaser phaser, int phase) {
int p = phaser.register(); // assumes caller not already registered
while (p < phase) {
if (phaser.isTerminated())
// ... deal with unexpected termination
else
p = phaser.arriveAndAwaitAdvance();
}
phaser.arriveAndDeregister();
}}
Untuk membuat sekumpulan n tugas menggunakan pohon phaser, Anda dapat menggunakan kode formulir berikut, dengan asumsi kelas Tugas dengan konstruktor menerima Phaser yang didaftarkannya saat konstruksi. Setelah pemanggilan build(new Task[n], 0, n, new Phaser()), tugas-tugas ini kemudian dapat dimulai, misalnya dengan mengirimkan ke kumpulan:
{@code
void build(Task[] tasks, int lo, int hi, Phaser ph) {
if (hi - lo > TASKS_PER_PHASER) {
for (int i = lo; i < hi; i += TASKS_PER_PHASER) {
int j = Math.min(i + TASKS_PER_PHASER, hi);
build(tasks, i, j, new Phaser(ph));
}
} else {
for (int i = lo; i < hi; ++i)
tasks[i] = new Task(ph);
// assumes new Task(ph) performs ph.register()
}
}}
Nilai TASKS_PER_PHASER terbaik tergantung terutama pada tingkat sinkronisasi yang diharapkan. Nilai serendah empat mungkin sesuai untuk badan tugas per fase yang sangat kecil (dengan demikian tingkat tinggi), atau hingga ratusan untuk yang sangat besar.
<b>Catatan implementasi:</b> Implementasi ini membatasi jumlah maksimum pihak hingga 65535. Upaya untuk mendaftarkan pihak tambahan menghasilkan IllegalStateException. Namun, Anda dapat dan harus membuat phaser berjenjang untuk mengakomodasi sekumpulan peserta yang sangat besar.
Ditambahkan dalam 1.7.
Dokumentasi Java untuk java.util.concurrent.Phaser.
Bagian halaman ini adalah modifikasi berdasarkan pekerjaan yang dibuat dan dibagikan oleh Proyek Sumber Terbuka Android dan digunakan sesuai dengan istilah yang dijelaskan dalam Lisensi Atribusi Creative Commons 2.5.
Konstruktor
| Phaser() |
Membuat phaser baru tanpa pihak yang awalnya terdaftar, tidak ada induk, dan fase awal nomor 0. |
| Phaser(Int32) |
Membuat phaser baru dengan jumlah pihak yang tidak terdaftar, tidak ada induk, dan fase awal nomor 0. |
| Phaser(IntPtr, JniHandleOwnership) |
Konstruktor yang digunakan saat membuat representasi terkelola objek JNI; dipanggil oleh runtime. |
| Phaser(Phaser) |
Setara dengan |
| Phaser(Phaser, Int32) |
Membuat phaser baru dengan induk yang diberikan dan jumlah pihak yang tidak terdaftar. |
Properti
| ArrivedParties |
Mengembalikan jumlah pihak terdaftar yang telah tiba pada fase saat ini dari phaser ini. |
| Class |
Mengembalikan kelas runtime dari . |
| Handle |
Handel ke instans Android yang mendasar. (Diperoleh dari Object) |
| IsTerminated |
Mengembalikan |
| JniIdentityHashCode |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| JniPeerMembers |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| Parent |
Mengembalikan induk dari phaser ini, atau |
| PeerReference |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| Phase |
Mengembalikan nomor fase saat ini. |
| RegisteredParties |
Mengembalikan jumlah pihak yang terdaftar pada phaser ini. |
| Root |
Mengembalikan leluhur akar dari phaser ini, yang sama dengan phaser ini jika tidak memiliki induk. |
| ThresholdClass |
API ini mendukung infrastruktur Mono untuk Android dan tidak dimaksudkan untuk digunakan langsung dari kode Anda. |
| ThresholdType |
API ini mendukung infrastruktur Mono untuk Android dan tidak dimaksudkan untuk digunakan langsung dari kode Anda. |
| UnarrivedParties |
Mengembalikan jumlah pihak terdaftar yang belum tiba pada fase saat ini dari phaser ini. |
Metode
| Arrive() |
Tiba di phaser ini, tanpa menunggu orang lain tiba. |
| ArriveAndAwaitAdvance() |
Tiba di phaser ini dan menunggu orang lain. |
| ArriveAndDeregister() |
Tiba di phaser ini dan membatalkan pendaftaran darinya tanpa menunggu orang lain tiba. |
| AwaitAdvance(Int32) |
Menunggu fase phaser ini untuk maju dari nilai fase yang diberikan, segera kembali jika fase saat ini tidak sama dengan nilai fase yang diberikan atau fase ini dihentikan. |
| AwaitAdvanceInterruptibly(Int32) |
Menunggu fase phaser ini untuk maju dari nilai fase yang diberikan, melempar |
| AwaitAdvanceInterruptibly(Int32, Int64, TimeUnit) |
Menunggu fase phaser ini untuk maju dari nilai fase yang diberikan atau batas waktu yang diberikan untuk berlalu, melemparkan |
| BulkRegister(Int32) |
Menambahkan jumlah pihak baru yang tidak disetujui yang diberikan ke phaser ini. |
| Clone() |
Membuat dan mengembalikan salinan objek ini. (Diperoleh dari Object) |
| Dispose() |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| Dispose(Boolean) |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| Equals(Object) |
Menunjukkan apakah beberapa objek lain "sama dengan" yang satu ini. (Diperoleh dari Object) |
| ForceTermination() |
Memaksa phaser ini untuk memasuki status penghentian. |
| GetHashCode() |
Mengembalikan nilai kode hash untuk objek . (Diperoleh dari Object) |
| JavaFinalize() |
Dipanggil oleh pengumpul sampah pada objek ketika pengumpulan sampah menentukan bahwa tidak ada lagi referensi ke objek. (Diperoleh dari Object) |
| Notify() |
Membangunkan satu utas yang menunggu monitor objek ini. (Diperoleh dari Object) |
| NotifyAll() |
Membangunkan semua utas yang menunggu monitor objek ini. (Diperoleh dari Object) |
| OnAdvance(Int32, Int32) |
Metode yang dapat diambil alih untuk melakukan tindakan setelah fase maju yang akan datang, dan untuk mengontrol penghentian. |
| Register() |
Menambahkan pihak baru yang tidak diajukan ke phaser ini. |
| SetHandle(IntPtr, JniHandleOwnership) |
Handle Mengatur properti. (Diperoleh dari Object) |
| ToArray<T>() |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| ToString() |
Mengembalikan representasi string objek. (Diperoleh dari Object) |
| UnregisterFromRuntime() |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| Wait() |
Menyebabkan utas saat ini menunggu sampai terbangun, biasanya dengan <diberitahu></em> atau <em>terganggu</em>. (Diperoleh dari Object) |
| Wait(Int64) |
Menyebabkan utas saat ini menunggu sampai terbangun, biasanya dengan <>diberitahu</em> atau <em>terganggu</em>, atau sampai sejumlah real time telah berlalu. (Diperoleh dari Object) |
| Wait(Int64, Int32) |
Menyebabkan utas saat ini menunggu sampai terbangun, biasanya dengan <>diberitahu</em> atau <em>terganggu</em>, atau sampai sejumlah real time telah berlalu. (Diperoleh dari Object) |
Implementasi Antarmuka Eksplisit
| IJavaPeerable.Disposed() |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| IJavaPeerable.DisposeUnlessReferenced() |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| IJavaPeerable.Finalized() |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| IJavaPeerable.JniManagedPeerState |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
Metode Ekstensi
| JavaCast<TResult>(IJavaObject) |
Melakukan konversi jenis yang diperiksa runtime Bahasa Umum Android. |
| JavaCast<TResult>(IJavaObject) |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |
| GetJniTypeName(IJavaPeerable) |
Penghambat sinkronisasi yang dapat digunakan kembali, mirip dalam fungsionalitas dengan |