ThreadPoolExecutor 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.
Yang ExecutorService menjalankan setiap tugas yang dikirimkan menggunakan salah satu dari mungkin beberapa utas yang dikumpulkan, biasanya dikonfigurasi menggunakan Executors metode pabrik.
[Android.Runtime.Register("java/util/concurrent/ThreadPoolExecutor", DoNotGenerateAcw=true)]
public class ThreadPoolExecutor : Java.Util.Concurrent.AbstractExecutorService
[<Android.Runtime.Register("java/util/concurrent/ThreadPoolExecutor", DoNotGenerateAcw=true)>]
type ThreadPoolExecutor = class
inherit AbstractExecutorService
- Warisan
- Turunan
- Atribut
Keterangan
Yang ExecutorService menjalankan setiap tugas yang dikirimkan menggunakan salah satu dari mungkin beberapa utas yang dikumpulkan, biasanya dikonfigurasi menggunakan Executors metode pabrik.
Kumpulan alur mengatasi dua masalah yang berbeda: mereka biasanya memberikan peningkatan performa saat menjalankan sejumlah besar tugas asinkron, karena mengurangi overhead pemanggilan per tugas, dan mereka menyediakan sarana pembatas dan pengelolaan sumber daya, termasuk utas, yang digunakan saat menjalankan kumpulan tugas. Masing-masing ThreadPoolExecutor juga mempertahankan beberapa statistik dasar, seperti jumlah tugas yang diselesaikan.
Agar berguna di berbagai konteks, kelas ini menyediakan banyak parameter dan kait ekstensibilitas yang dapat disesuaikan. Namun, programmer didesak untuk menggunakan metode pabrik yang lebih nyaman Executors (kumpulan utas yang tidak terbatas, dengan reklamasi utas otomatis), Executors#newFixedThreadPool (kumpulan utas ukuran tetap) dan Executors#newSingleThreadExecutor (utas Executors#newCachedThreadPool latar belakang tunggal), yang mengonfigurasi pengaturan prakonfigurasi untuk skenario penggunaan yang paling umum. Jika tidak, gunakan panduan berikut saat mengonfigurasi dan menyetel kelas ini secara manual:
<Dl>
<dt>Core dan ukuran</dt kumpulan maksimum>
<dd>A ThreadPoolExecutor akan secara otomatis menyesuaikan ukuran kumpulan (lihat #getPoolSize) sesuai dengan batas yang ditetapkan oleh corePoolSize (lihat #getCorePoolSize) dan maximumPoolSize (lihat #getMaximumPoolSize).
Ketika tugas baru dikirimkan dalam metode #execute(Runnable), jika lebih sedikit dari rangkaian corePoolSize yang berjalan, utas baru dibuat untuk menangani permintaan, bahkan jika utas pekerja lain menganggur. Jika tidak, jika lebih sedikit dari utas maximumPoolSize yang berjalan, utas baru akan dibuat untuk menangani permintaan hanya jika antrean penuh. Dengan mengatur corePoolSize dan maximumPoolSize sama, Anda membuat kumpulan utas ukuran tetap. Dengan mengatur maximumPoolSize ke nilai yang pada dasarnya tidak terikat seperti Integer.MAX_VALUE, Anda mengizinkan kumpulan untuk mengakomodasi jumlah tugas bersamaan yang arbitrer. Biasanya, ukuran kumpulan inti dan maksimum diatur hanya setelah konstruksi, tetapi juga dapat diubah secara dinamis menggunakan #setCorePoolSize dan #setMaximumPoolSize. </Dd>
<dt>Konstruksi< sesuai permintaan/dt>
<dd>Secara default, bahkan utas inti awalnya dibuat dan dimulai hanya ketika tugas baru tiba, tetapi ini dapat ditimpa secara dinamis menggunakan metode #prestartCoreThread atau #prestartAllCoreThreads. Anda mungkin ingin memulai utas terlebih dahulu jika Anda membuat kumpulan dengan antrean yang tidak kosong. </Dd>
<dt>Membuat utas</dt baru>
<dd>Utas baru dibuat menggunakan ThreadFactory. Jika tidak ditentukan lain, Executors#defaultThreadFactory digunakan, yang membuat utas ke semua berada dalam status yang sama ThreadGroup dan dengan prioritas dan status non-daemon yang sama NORM_PRIORITY . Dengan menyediakan ThreadFactory yang berbeda, Anda dapat mengubah nama utas, grup utas, prioritas, status daemon, dll. ThreadFactory Jika gagal membuat utas ketika diminta dengan mengembalikan null dari newThread, pelaksana akan berlanjut, tetapi mungkin tidak dapat menjalankan tugas apa pun. Utas harus memiliki "modifikasiThread" RuntimePermission. Jika utas pekerja atau utas lain yang menggunakan kumpulan tidak memiliki izin ini, layanan mungkin diturunkan: perubahan konfigurasi mungkin tidak berlaku tepat waktu, dan kumpulan pematian mungkin tetap dalam keadaan di mana penghentian dimungkinkan tetapi tidak selesai.</Dd>
<dt>Keep-alive times</dt>
<dd>Jika kumpulan saat ini memiliki lebih dari thread corePoolSize, utas berlebih akan dihentikan jika mereka telah menganggur selama lebih dari keepAliveTime (lihat #getKeepAliveTime(TimeUnit)). Ini menyediakan sarana untuk mengurangi konsumsi sumber daya ketika kumpulan tidak digunakan secara aktif. Jika kumpulan menjadi lebih aktif nanti, utas baru akan dibangun. Parameter ini juga dapat diubah secara dinamis menggunakan metode #setKeepAliveTime(long, TimeUnit). Menggunakan nilai Long.MAX_VALUETimeUnit#NANOSECONDS secara efektif menonaktifkan utas diam agar tidak pernah berakhir sebelum dimatikan. Secara default, kebijakan tetap hidup hanya berlaku ketika ada lebih dari rangkaian corePoolSize, tetapi metode #allowCoreThreadTimeOut(boolean) dapat digunakan untuk menerapkan kebijakan batas waktu ini ke utas inti juga, selama nilai keepAliveTime bukan nol. </Dd>
<dt>Queuing</dt>
<dd>Apa pun BlockingQueue dapat digunakan untuk mentransfer dan menahan tugas yang dikirimkan. Penggunaan antrean ini berinteraksi dengan ukuran kumpulan:
<Ul>
<li>Jika lebih sedikit dari rangkaian corePoolSize yang berjalan, Pelaksana selalu lebih suka menambahkan utas baru daripada mengantre.
<li>Jika corePoolSize atau lebih utas berjalan, Pelaksana selalu lebih suka mengantre permintaan daripada menambahkan utas baru.
<li>Jika permintaan tidak dapat diantrekan, utas baru dibuat kecuali ini akan melebihi maximumPoolSize, dalam hal ini, tugas akan ditolak.
</Ul>
Ada tiga strategi umum untuk antrean: <ol>
<Li><em> Langsung handoffs.</em> Pilihan default yang baik untuk antrean kerja adalah SynchronousQueue tugas yang menyerahkan tugas ke utas tanpa menahannya. Di sini, upaya untuk mengantre tugas akan gagal jika tidak ada utas yang segera tersedia untuk menjalankannya, sehingga utas baru akan dibangun. Kebijakan ini menghindari penguncian saat menangani serangkaian permintaan yang mungkin memiliki dependensi internal. Handoff langsung umumnya memerlukan maximumPoolSizes yang tidak terbatas untuk menghindari penolakan tugas baru yang dikirimkan. Ini pada gilirannya mengakui kemungkinan pertumbuhan utas yang tidak terbatas ketika perintah terus tiba rata-rata lebih cepat daripada yang dapat diproses.
<li><em> Antrean tidak terbatas.</em> Menggunakan antrean yang tidak terbatas (misalnya LinkedBlockingQueue tanpa kapasitas yang telah ditentukan sebelumnya) akan menyebabkan tugas baru menunggu dalam antrean ketika semua utas corePoolSize sibuk. Dengan demikian, tidak lebih dari rangkaian corePoolSize yang akan pernah dibuat. (Dan nilai maximumPoolSize oleh karena itu tidak memiliki efek apa pun.) Ini mungkin tepat ketika setiap tugas benar-benar independen dari orang lain, sehingga tugas tidak dapat memengaruhi setiap eksekusi lainnya; misalnya, di server halaman web. Meskipun gaya antrean ini dapat berguna dalam memuluskan semburan permintaan sementara, gaya ini mengakui kemungkinan pertumbuhan antrean kerja yang tidak terbatas ketika perintah terus tiba rata-rata lebih cepat daripada yang dapat diproses.
<li><em>Antrean terikat.</em> Antrean terikat (misalnya, an ArrayBlockingQueue) membantu mencegah kelelahan sumber daya saat digunakan dengan finite maximumPoolSizes, tetapi bisa lebih sulit untuk disetel dan dikontrol. Ukuran antrean dan ukuran kumpulan maksimum dapat diperdagangkan satu sama lain: Menggunakan antrean besar dan kumpulan kecil meminimalkan penggunaan CPU, sumber daya OS, dan overhead pengalihan konteks, tetapi dapat menyebabkan throughput yang rendah secara buatan. Jika tugas sering memblokir (misalnya jika terikat I/O), sistem mungkin dapat menjadwalkan waktu untuk lebih banyak utas daripada yang Anda izinkan. Penggunaan antrean kecil umumnya memerlukan ukuran kumpulan yang lebih besar, yang membuat CPU lebih sibuk tetapi mungkin mengalami overhead penjadwalan yang tidak dapat diterima, yang juga mengurangi throughput.
</Ol>
</Dd>
<dt>Rejected tasks</dt>
<dd>Tugas baru yang dikirimkan dalam metode #execute(Runnable) akan em>ditolak<</em> ketika Pelaksana telah dimatikan, dan juga ketika Pelaksana menggunakan batas terbatas untuk utas maksimum dan kapasitas antrean kerja, dan jenuh. Dalam kedua kasus, metode RejectedExecutionHandler#rejectedExecution(Runnable, ThreadPoolExecutor) memanggil execute metode RejectedExecutionHandler. Empat kebijakan handler yang telah ditentukan sebelumnya disediakan:
<Ol>
<li>Dalam default ThreadPoolExecutor.AbortPolicy, handler melempar runtime RejectedExecutionException setelah penolakan.
<li>In ThreadPoolExecutor.CallerRunsPolicy, utas execute yang memanggil dirinya menjalankan tugas. Ini menyediakan mekanisme kontrol umpan balik sederhana yang akan memperlambat laju pengiriman tugas baru.
<li>In ThreadPoolExecutor.DiscardPolicy, tugas yang tidak dapat dijalankan hanya dihilangkan. Kebijakan ini dirancang hanya untuk kasus-kasus langka di mana penyelesaian tugas tidak pernah diandalkan.
<li>In ThreadPoolExecutor.DiscardOldestPolicy, jika pelaksana tidak dimatikan, tugas di kepala antrean kerja dihilangkan, dan kemudian eksekusi dicoba kembali (yang dapat gagal lagi, menyebabkan hal ini diulang.) Kebijakan ini jarang dapat diterima. Dalam hampir semua kasus, Anda juga harus membatalkan tugas untuk menyebabkan pengecualian dalam komponen apa pun yang menunggu penyelesaiannya, dan/atau mencatat kegagalan, seperti yang diilustrasikan dalam ThreadPoolExecutor.DiscardOldestPolicy dokumentasi.
</Ol>
Dimungkinkan untuk menentukan dan menggunakan jenis RejectedExecutionHandler kelas lainnya. Melakukannya membutuhkan beberapa kepedulian terutama ketika kebijakan dirancang untuk bekerja hanya di bawah kapasitas atau kebijakan antrean tertentu. </Dd>
<dt>Hook methods</dt>
<dd>Kelas ini menyediakan protected metode yang dapat #beforeExecute(Thread, Runnable) diganti dan #afterExecute(Runnable, Throwable) dipanggil sebelum dan sesudah eksekusi setiap tugas. Ini dapat digunakan untuk memanipulasi lingkungan eksekusi; misalnya, menginisialisasi ulang ThreadLocals, mengumpulkan statistik, atau menambahkan entri log. Selain itu, metode #terminated dapat ditimpa untuk melakukan pemrosesan khusus yang perlu dilakukan setelah Pelaksana telah sepenuhnya dihentikan.
Jika metode hook, callback, atau BlockingQueue melemparkan pengecualian, utas pekerja internal pada gilirannya mungkin gagal, tiba-tiba dihentikan, dan mungkin diganti.</Dd>
<dt>Queue maintenance</dt>
<Metode #getQueue() dd>memungkinkan akses ke antrean kerja untuk tujuan pemantauan dan penelusuran kesalahan. Penggunaan metode ini untuk tujuan lain sangat tidak disarankan. Dua metode yang disediakan, #remove(Runnable) dan #purge tersedia untuk membantu dalam reklamasi penyimpanan ketika sejumlah besar tugas antrean dibatalkan.</Dd>
<dt>Reklamasi</dt>
<dd>Kumpulan yang tidak lagi direferensikan dalam program <em>AND</em> tidak memiliki utas yang tersisa dapat direklamasi kembali (sampah dikumpulkan) tanpa dimatikan secara eksplisit. Anda dapat mengonfigurasi kumpulan untuk memungkinkan semua utas yang tidak digunakan pada akhirnya mati dengan mengatur waktu tetap hidup yang sesuai, menggunakan batas yang lebih rendah dari utas inti nol dan/atau pengaturan #allowCoreThreadTimeOut(boolean). </Dd>
</Dl>
<Contoh Ekstensi b>.</b> Sebagian besar ekstensi kelas ini mengambil alih satu atau beberapa metode kait yang dilindungi. Misalnya, berikut adalah subkelas yang menambahkan fitur jeda/lanjutkan sederhana:
{@code
class PausableThreadPoolExecutor extends ThreadPoolExecutor {
private boolean isPaused;
private ReentrantLock pauseLock = new ReentrantLock();
private Condition unpaused = pauseLock.newCondition();
public PausableThreadPoolExecutor(...) { super(...); }
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
pauseLock.lock();
try {
while (isPaused) unpaused.await();
} catch (InterruptedException ie) {
t.interrupt();
} finally {
pauseLock.unlock();
}
}
public void pause() {
pauseLock.lock();
try {
isPaused = true;
} finally {
pauseLock.unlock();
}
}
public void resume() {
pauseLock.lock();
try {
isPaused = false;
unpaused.signalAll();
} finally {
pauseLock.unlock();
}
}
}}
Ditambahkan dalam 1.5.
Dokumentasi Java untuk java.util.concurrent.ThreadPoolExecutor.
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
| ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue) |
Membuat baru |
| ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IRejectedExecutionHandler) |
Membuat baru |
| ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IThreadFactory) |
Membuat baru |
| ThreadPoolExecutor(Int32, Int32, Int64, TimeUnit, IBlockingQueue, IThreadFactory, IRejectedExecutionHandler) |
Membuat baru |
| ThreadPoolExecutor(IntPtr, JniHandleOwnership) |
Konstruktor yang digunakan saat membuat representasi terkelola objek JNI; dipanggil oleh runtime. |
Properti
| ActiveCount |
Mengembalikan perkiraan jumlah utas yang secara aktif menjalankan tugas. |
| Class |
Mengembalikan kelas runtime dari . |
| CompletedTaskCount |
Mengembalikan perkiraan jumlah total tugas yang telah menyelesaikan eksekusi. |
| CorePoolSize |
Mengembalikan jumlah inti utas. -or- Mengatur jumlah inti utas. |
| Handle |
Handel ke instans Android yang mendasar. (Diperoleh dari Object) |
| IsShutdown |
Yang |
| IsTerminated |
Yang |
| IsTerminating |
Mengembalikan true jika pelaksana ini sedang dalam proses penghentian setelah |
| JniIdentityHashCode |
Yang |
| JniPeerMembers |
Yang |
| LargestPoolSize |
Mengembalikan jumlah utas terbesar yang pernah secara bersamaan berada di kumpulan. |
| MaximumPoolSize |
Mengembalikan jumlah utas maksimum yang diizinkan. -atau- Mengatur jumlah utas maksimum yang diizinkan. |
| PeerReference |
Yang |
| PoolSize |
Mengembalikan jumlah utas saat ini dalam kumpulan. |
| Queue |
Mengembalikan antrean tugas yang digunakan oleh pelaksana ini. |
| RejectedExecutionHandler |
Mengembalikan handler saat ini untuk tugas yang tidak dapat dieksekusi. -or- Mengatur handler baru untuk tugas yang tidak dapat dieksekusi. |
| TaskCount |
Mengembalikan perkiraan jumlah total tugas yang pernah dijadwalkan untuk eksekusi. |
| ThreadFactory |
Mengembalikan pabrik utas yang digunakan untuk membuat utas baru. -or- Mengatur pabrik utas yang digunakan untuk membuat utas baru. |
| 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. |
Metode
| AfterExecute(IRunnable, Throwable) |
Metode yang dipanggil setelah selesai menjalankan Runnable yang diberikan. |
| AllowCoreThreadTimeOut(Boolean) |
Mengatur kebijakan yang mengatur apakah utas inti mungkin kehabisan waktu dan berakhir jika tidak ada tugas yang tiba dalam waktu tetap hidup, diganti jika diperlukan saat tugas baru tiba. |
| AllowsCoreThreadTimeOut() |
Mengembalikan true jika kumpulan ini memungkinkan utas inti kehabisan waktu dan berakhir jika tidak ada tugas yang tiba dalam waktu keepAlive, diganti jika diperlukan saat tugas baru tiba. |
| AwaitTermination(Int64, TimeUnit) |
Yang |
| AwaitTerminationAsync(Int64, TimeUnit) |
Yang |
| BeforeExecute(Thread, IRunnable) |
Metode yang dipanggil sebelum menjalankan Runnable yang diberikan dalam utas yang diberikan. |
| Clone() |
Membuat dan mengembalikan salinan objek ini. (Diperoleh dari Object) |
| Dispose() |
Yang |
| Dispose(Boolean) |
Yang |
| Equals(Object) |
Menunjukkan apakah beberapa objek lain "sama dengan" yang satu ini. (Diperoleh dari Object) |
| Execute(IRunnable) |
Menjalankan tugas yang diberikan suatu saat di masa mendatang. |
| GetHashCode() |
Mengembalikan nilai kode hash untuk objek . (Diperoleh dari Object) |
| GetKeepAliveTime(TimeUnit) |
Mengembalikan waktu keep-alive thread, yang merupakan jumlah waktu utas mungkin tetap menganggur sebelum dihentikan. |
| InvokeAll(ICollection) |
Yang |
| InvokeAll(ICollection, Int64, TimeUnit) |
Yang |
| InvokeAny(ICollection) |
Yang |
| InvokeAny(ICollection, Int64, TimeUnit) |
Yang |
| JavaFinalize() |
Dipanggil oleh pengumpul sampah pada objek ketika pengumpulan sampah menentukan bahwa tidak ada lagi referensi ke objek. (Diperoleh dari Object) |
| NewTaskFor(ICallable) |
Mengembalikan untuk tugas yang |
| NewTaskFor(IRunnable, Object) |
Mengembalikan |
| Notify() |
Membangunkan satu utas yang menunggu monitor objek ini. (Diperoleh dari Object) |
| NotifyAll() |
Membangunkan semua utas yang menunggu monitor objek ini. (Diperoleh dari Object) |
| PrestartAllCoreThreads() |
Memulai semua utas inti, menyebabkannya tidak menunggu pekerjaan. |
| PrestartCoreThread() |
Memulai utas inti, menyebabkannya tidak menunggu pekerjaan. |
| Purge() |
Mencoba menghapus dari antrean kerja semua |
| Remove(IRunnable) |
Menghapus tugas ini dari antrean internal pelaksana jika ada, sehingga menyebabkannya tidak dijalankan jika belum dimulai. |
| SetHandle(IntPtr, JniHandleOwnership) |
Handle Mengatur properti. (Diperoleh dari Object) |
| SetKeepAliveTime(Int64, TimeUnit) |
Mengatur waktu tetap aktif utas, yang merupakan jumlah waktu utas mungkin tetap menganggur sebelum dihentikan. |
| Shutdown() |
Memulai pematian tertib di mana tugas yang dikirim sebelumnya dijalankan, tetapi tidak ada tugas baru yang akan diterima. |
| ShutdownNow() |
Upaya untuk menghentikan semua tugas yang dijalankan secara aktif, menghentikan pemrosesan tugas tunggu, dan mengembalikan daftar tugas yang sedang menunggu eksekusi. |
| Submit(ICallable) |
Yang |
| Submit(IRunnable) |
Mengirimkan tugas yang Dapat Dijalankan untuk eksekusi dan mengembalikan Masa Depan yang mewakili tugas tersebut. (Diperoleh dari AbstractExecutorService) |
| Submit(IRunnable, Object) |
Yang |
| Terminated() |
Metode dipanggil ketika Pelaksana telah dihentikan. |
| ToArray<T>() |
Yang |
| ToString() |
Mengembalikan representasi string objek. (Diperoleh dari Object) |
| UnregisterFromRuntime() |
Yang |
| 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() |
Yang |
| IJavaPeerable.DisposeUnlessReferenced() |
Yang |
| IJavaPeerable.Finalized() |
Yang |
| IJavaPeerable.JniManagedPeerState |
Yang |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Yang |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Yang |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Yang |
Metode Ekstensi
| JavaCast<TResult>(IJavaObject) |
Melakukan konversi jenis yang diperiksa runtime Bahasa Umum Android. |
| JavaCast<TResult>(IJavaObject) |
Yang |
| GetJniTypeName(IJavaPeerable) |
Yang |
| AwaitTerminationAsync(IExecutorService, Int64, TimeUnit) |
Yang |
| InvokeAnyAsync(IExecutorService, ICollection) |
Yang |
| InvokeAnyAsync(IExecutorService, ICollection, Int64, TimeUnit) |
Yang |