ForkJoinTask 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.
Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.
[Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "V" })]
public abstract class ForkJoinTask : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable, Java.Util.Concurrent.IFuture
[<Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "V" })>]
type ForkJoinTask = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IFuture
- Warisan
- Turunan
- Atribut
- Penerapan
Keterangan
Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool. adalah ForkJoinTask entitas seperti utas yang jauh lebih ringan daripada utas normal. Sejumlah besar tugas dan subtugas dapat dihosting oleh sejumlah kecil utas aktual di ForkJoinPool, dengan harga beberapa batasan penggunaan.
"utama" ForkJoinTask memulai eksekusi ketika secara eksplisit dikirimkan ke ForkJoinPool, atau, jika belum terlibat dalam komputasi ForkJoin, dimulai dalam ForkJoinPool#commonPool() melalui #fork, , #invokeatau metode terkait. Setelah dimulai, biasanya pada gilirannya akan memulai subtugas lain. Seperti yang ditunjukkan dengan nama kelas ini, banyak program yang hanya menggunakan ForkJoinTask metode #fork dan #join, atau turunan seperti #invokeAll(ForkJoinTask...) invokeAll. Namun, kelas ini juga menyediakan sejumlah metode lain yang dapat dimainkan dalam penggunaan lanjutan, serta mekanika ekstensi yang memungkinkan dukungan bentuk baru pemrosesan fork/gabungan.
adalah ForkJoinTask bentuk ringan dari Future. Efisiensi ForkJoinTasks berasal dari serangkaian pembatasan (yang hanya dapat diberlakukan sebagian secara statis) yang mencerminkan penggunaan utama mereka sebagai tugas komputasi menghitung fungsi murni atau beroperasi pada objek yang murni terisolasi. Mekanisme koordinasi utama adalah #fork, yang mengatur eksekusi asinkron, dan #join, yang tidak dilanjutkan sampai hasil tugas telah dihitung. Komputasi idealnya harus menghindari synchronized metode atau blok, dan harus meminimalkan sinkronisasi pemblokiran lainnya selain menggabungkan tugas lain atau menggunakan penyinkron seperti Phasers yang diiklankan untuk bekerja sama dengan penjadwalan fork/join. Tugas yang dapat dibagikan juga tidak boleh melakukan pemblokiran I/O, dan idealnya harus mengakses variabel yang sepenuhnya independen dari yang diakses oleh tugas lain yang sedang berjalan. Pedoman ini diberlakukan secara longgar dengan tidak mengizinkan pengecualian yang diperiksa seperti IOExceptions dilemparkan. Namun, komputasi mungkin masih mengalami pengecualian yang tidak dicentang, yang ditumbuhi kembali kepada penelepon yang mencoba menggabungkannya. Pengecualian ini juga dapat mencakup RejectedExecutionException berasal dari kelelahan sumber daya internal, seperti kegagalan untuk mengalokasikan antrean tugas internal. Pengecualian yang ditumbuhkan kembali berperilaku dengan cara yang sama seperti pengecualian reguler, tetapi, jika memungkinkan, berisi jejak tumpukan (seperti yang ditampilkan misalnya menggunakan ex.printStackTrace()) dari kedua utas yang memulai komputasi serta utas benar-benar mengalami pengecualian; minimal hanya yang terakhir.
Dimungkinkan untuk menentukan dan menggunakan ForkJoinTasks yang dapat memblokir, tetapi melakukannya memerlukan tiga pertimbangan lebih lanjut: (1) Penyelesaian beberapa jika ada <tugas lain></em> yang harus bergantung pada tugas yang memblokir sinkronisasi eksternal atau I/O. Tugas asinkron gaya peristiwa yang tidak pernah digabungkan (misalnya, subkelas CountedCompletertersebut) sering kali termasuk dalam kategori ini. (2) Untuk meminimalkan dampak sumber daya, tugas harus kecil; idealnya hanya melakukan tindakan pemblokiran (mungkin). (3) Kecuali ForkJoinPool.ManagedBlocker API digunakan, atau jumlah tugas yang mungkin diblokir diketahui kurang dari tingkat kumpulan ForkJoinPool#getParallelism , kumpulan tidak dapat menjamin bahwa utas yang cukup akan tersedia untuk memastikan kemajuan atau performa yang baik.
Metode utama untuk menunggu penyelesaian dan mengekstrak hasil tugas adalah #join, tetapi ada beberapa varian: Metode Future#get mendukung interupsi dan/atau waktu tunggu penyelesaian dan hasil laporan menggunakan Future konvensi. Metode #invoke secara semantik setara fork(); join() dengan tetapi selalu mencoba untuk memulai eksekusi di utas saat ini. Bentuk "<em>diam</em>" dari metode ini tidak mengekstrak hasil atau melaporkan pengecualian. Ini mungkin berguna ketika sekumpulan tugas dijalankan, dan Anda perlu menunda pemrosesan hasil atau pengecualian sampai semua selesai. Metode invokeAll (tersedia dalam beberapa versi) melakukan bentuk pemanggilan paralel yang paling umum: memalsukan serangkaian tugas dan menggabungkan semuanya.
Dalam penggunaan yang paling umum, pasangan fork-join bertindak seperti panggilan (fork) dan mengembalikan (bergabung) dari fungsi rekursif paralel. Seperti halnya dengan bentuk panggilan rekursif lainnya, pengembalian (gabungan) harus dilakukan terlebih dahulu. Misalnya, a.fork(); b.fork(); b.join(); a.join(); kemungkinan akan jauh lebih efisien daripada bergabung a sebelum b.
Status eksekusi tugas dapat dikueri pada beberapa tingkat detail: #isDone benar jika tugas selesai dengan cara apa pun (termasuk kasus di mana tugas dibatalkan tanpa dieksekusi); #isCompletedNormally adalah benar jika tugas selesai tanpa pembatalan atau mengalami pengecualian; #isCancelled adalah benar jika tugas dibatalkan (dalam hal #getException ini mengembalikan CancellationException); dan #isCompletedAbnormally benar jika tugas dibatalkan atau mengalami pengecualian, dalam hal ini #getException akan mengembalikan pengecualian yang ditemui atau CancellationException.
Kelas ForkJoinTask biasanya tidak secara langsung disubkelas. Sebagai gantinya RecursiveAction , Anda subkelas salah satu kelas abstrak yang mendukung gaya pemrosesan fork/gabungan tertentu, biasanya untuk sebagian besar komputasi yang tidak mengembalikan hasil, RecursiveTask bagi mereka yang melakukannya, dan CountedCompleter bagi mereka yang menyelesaikan tindakan memicu tindakan lain. Biasanya, subkelas ForkJoinTask beton mendeklarasikan bidang yang terdiri dari parameternya, ditetapkan dalam konstruktor, dan kemudian mendefinisikan compute metode yang entah bagaimana menggunakan metode kontrol yang disediakan oleh kelas dasar ini.
Metode #join dan variannya sesuai untuk digunakan hanya ketika dependensi penyelesaian adalah acyclic; artinya, komputasi paralel dapat digambarkan sebagai grafik acyclic terarah (DAG). Jika tidak, eksekusi mungkin mengalami bentuk kebuntuan karena tugas secara siklus menunggu satu sama lain. Namun, kerangka kerja ini mendukung metode dan teknik lain (misalnya penggunaan Phaser, , #helpQuiescedan #complete) yang mungkin digunakan dalam membangun subkelas kustom untuk masalah yang tidak disusun secara statis sebagai DAG. Untuk mendukung penggunaan tersebut, ForkJoinTask mungkin secara atomis <ditandai<>/em> dengan short nilai menggunakan #setForkJoinTaskTag atau #compareAndSetForkJoinTaskTag dan dicentang menggunakan #getForkJoinTaskTag. Implementasi ForkJoinTask tidak menggunakan metode atau tag ini protected untuk tujuan apa pun, tetapi mungkin digunakan dalam pembangunan subkelas khusus. Misalnya, traversal grafik paralel dapat menggunakan metode yang disediakan untuk menghindari mengunjungi kembali simpul/tugas yang telah diproses. (Nama metode untuk pemberian tag sebagian besar untuk mendorong definisi metode yang mencerminkan pola penggunaannya.)
Sebagian besar metode dukungan dasar adalah final, untuk mencegah penimpaan implementasi yang secara intrinsik terkait dengan kerangka kerja penjadwalan tugas ringan yang mendasar. Pengembang yang membuat gaya dasar baru pemrosesan fork/join harus mengimplementasikan protected metode #exec, , #setRawResultdan #getRawResult, sekaligus memperkenalkan metode komputasi abstrak yang dapat diimplementasikan dalam subkelasnya, mungkin mengandalkan metode lain protected yang disediakan oleh kelas ini.
ForkJoinTasks harus melakukan komputasi dalam jumlah yang relatif kecil. Tugas besar harus dibagi menjadi subtugas yang lebih kecil, biasanya melalui penguraian rekursif. Sebagai aturan praktis yang sangat kasar, tugas harus melakukan lebih dari 100 dan kurang dari 10000 langkah komputasi dasar, dan harus menghindari perulangan yang tidak terbatas. Jika tugas terlalu besar, maka paralelisme tidak dapat meningkatkan throughput. Jika terlalu kecil, maka overhead pemeliharaan tugas memori dan internal dapat membuat pemrosesan kewalahan.
Kelas ini menyediakan adapt metode untuk Runnable dan Callable, yang mungkin digunakan saat mencampur eksekusi ForkJoinTasks dengan jenis tugas lain. Ketika semua tugas dalam bentuk ini, pertimbangkan untuk menggunakan kumpulan yang dibangun di <em>asyncMode</em>.
ForkJoinTasks adalah Serializable, yang memungkinkan mereka digunakan dalam ekstensi seperti kerangka kerja eksekusi jarak jauh. Masuk akal untuk menserialisasikan tugas hanya sebelum atau sesudahnya, tetapi tidak selama, eksekusi. Serialisasi tidak diandalkan selama eksekusi itu sendiri.
Ditambahkan dalam 1.7.
Dokumentasi Java untuk java.util.concurrent.ForkJoinTask.
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
| ForkJoinTask() |
Konstruktor untuk subkelas yang akan dipanggil. |
| ForkJoinTask(IntPtr, JniHandleOwnership) |
Konstruktor yang digunakan saat membuat representasi terkelola objek JNI; dipanggil oleh runtime. |
Properti
| Class |
Mengembalikan kelas runtime dari . |
| Exception |
Mengembalikan pengecualian yang dilemparkan oleh komputasi dasar, atau |
| ForkJoinTaskTag |
Mengembalikan tag untuk tugas ini. |
| Handle |
Handel ke instans Android yang mendasar. (Diperoleh dari Object) |
| IsCancelled |
Mengembalikan |
| IsCompletedAbnormally |
Mengembalikan |
| IsCompletedNormally |
Mengembalikan |
| IsDone |
Mengembalikan |
| JniIdentityHashCode |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| JniPeerMembers |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| PeerReference |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| Pool |
Mengembalikan kumpulan yang menghosting utas saat ini, atau |
| QueuedTaskCount |
Mengembalikan perkiraan jumlah tugas yang telah di-fork oleh utas pekerja saat ini tetapi belum dijalankan. |
| RawRawResult |
Mengembalikan hasil yang akan dikembalikan oleh Join(), meskipun tugas ini selesai secara tidak normal, atau |
| SurplusQueuedTaskCount |
Mengembalikan perkiraan berapa banyak tugas yang diantrekan secara lokal yang dipegang oleh utas pekerja saat ini daripada ada utas pekerja lain yang mungkin mencurinya, atau nol jika utas ini tidak beroperasi di ForkJoinPool. |
| 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
| Adapt(ICallable) |
Mengembalikan baru yang melakukan |
| Adapt(IRunnable) |
Mengembalikan baru |
| Adapt(IRunnable, Object) |
Mengembalikan baru |
| Cancel(Boolean) |
Mencoba membatalkan eksekusi tugas ini. |
| Clone() |
Membuat dan mengembalikan salinan objek ini. (Diperoleh dari Object) |
| CompareAndSetForkJoinTaskTag(Int16, Int16) |
Secara kondisional mengatur nilai tag untuk tugas ini secara atomik. |
| Complete(Object) |
Menyelesaikan tugas ini, dan jika belum dibatalkan atau dibatalkan, mengembalikan nilai yang diberikan sebagai hasil dari pemanggilan berikutnya dan |
| CompleteExceptionally(Throwable) |
Menyelesaikan tugas ini secara tidak normal, dan jika belum dibatalkan atau dibatalkan, menyebabkannya melemparkan pengecualian yang diberikan pada |
| Dispose() |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| Dispose(Boolean) |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| Equals(Object) |
Menunjukkan apakah beberapa objek lain "sama dengan" yang satu ini. (Diperoleh dari Object) |
| Exec() |
Segera melakukan tindakan dasar tugas ini dan mengembalikan true jika, setelah dikembalikan dari metode ini, tugas ini dijamin telah selesai. |
| Fork() |
Mengatur untuk menjalankan tugas ini secara asinkron di kumpulan tempat tugas saat ini berjalan, jika berlaku, atau menggunakan |
| Get() |
Menunggu jika perlu untuk menyelesaikan komputasi, lalu mengambil hasilnya. |
| Get(Int64, TimeUnit) |
Menunggu jika perlu untuk sebagian besar waktu yang diberikan agar komputasi selesai, lalu mengambil hasilnya, jika tersedia. |
| GetHashCode() |
Mengembalikan nilai kode hash untuk objek . (Diperoleh dari Object) |
| HelpQuiesce() |
Mungkin menjalankan tugas hingga kumpulan yang menghosting tugas saat ini ForkJoinPool#isQuiescent bersifat quiescent. |
| InForkJoinPool() |
Mengembalikan jika utas |
| Invoke() |
Memulai melakukan tugas ini, menunggu penyelesaiannya jika perlu, dan mengembalikan hasilnya, atau melempar (tidak dicentang) |
| InvokeAll(ForkJoinTask, ForkJoinTask) |
Fork tugas yang diberikan, kembali saat |
| InvokeAll(ForkJoinTask[]) |
Fork semua tugas dalam koleksi yang ditentukan, kembali saat |
| InvokeAll(ICollection) |
Fork semua tugas dalam koleksi yang ditentukan, kembali saat |
| JavaFinalize() |
Dipanggil oleh pengumpul sampah pada objek ketika pengumpulan sampah menentukan bahwa tidak ada lagi referensi ke objek. (Diperoleh dari Object) |
| Join() |
Mengembalikan hasil komputasi saat #isDone selesai. |
| Notify() |
Membangunkan satu utas yang menunggu monitor objek ini. (Diperoleh dari Object) |
| NotifyAll() |
Membangunkan semua utas yang menunggu monitor objek ini. (Diperoleh dari Object) |
| PeekNextLocalTask() |
Mengembalikan, tetapi tidak membatalkan jadwal atau menjalankan, tugas yang diantrekan oleh utas saat ini tetapi belum dijalankan, jika tugas segera tersedia. |
| PollNextLocalTask() |
Batalkan jadwal dan pengembalian, tanpa mengeksekusi, tugas berikutnya yang diantrekan oleh utas saat ini tetapi belum dijalankan, jika utas saat ini beroperasi di ForkJoinPool. |
| PollTask() |
Jika utas saat ini beroperasi di ForkJoinPool, tidak terjadwal dan kembali, tanpa mengeksekusi, tugas berikutnya yang diantrekan oleh utas saat ini tetapi belum dijalankan, jika tersedia, atau jika tidak tersedia, tugas yang dicabut oleh beberapa utas lain, jika tersedia. |
| QuietlyComplete() |
Menyelesaikan tugas ini secara normal tanpa mengatur nilai. |
| QuietlyInvoke() |
Memulai melakukan tugas ini dan menunggu penyelesaiannya jika perlu, tanpa mengembalikan hasilnya atau melemparkan pengecualiannya. |
| QuietlyJoin() |
Menggabungkan tugas ini, tanpa mengembalikan hasilnya atau melemparkan pengecualiannya. |
| Reinitialize() |
Mengatur ulang status pembbukuan internal tugas ini, memungkinkan |
| SetForkJoinTaskTag(Int16) |
Secara atomis mengatur nilai tag untuk tugas ini dan mengembalikan nilai lama. |
| SetHandle(IntPtr, JniHandleOwnership) |
Handle Mengatur properti. (Diperoleh dari Object) |
| SetRawResult(Object) |
Memaksa nilai yang diberikan untuk dikembalikan sebagai hasilnya. |
| ToArray<T>() |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| ToString() |
Mengembalikan representasi string objek. (Diperoleh dari Object) |
| TryUnfork() |
Mencoba membatalkan jadwal tugas ini untuk eksekusi. |
| UnregisterFromRuntime() |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| 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() |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| IJavaPeerable.DisposeUnlessReferenced() |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| IJavaPeerable.Finalized() |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| IJavaPeerable.JniManagedPeerState |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
Metode Ekstensi
| JavaCast<TResult>(IJavaObject) |
Melakukan konversi jenis yang diperiksa runtime Bahasa Umum Android. |
| JavaCast<TResult>(IJavaObject) |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| GetJniTypeName(IJavaPeerable) |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| GetAsync(IFuture) |
Kelas dasar abstrak untuk tugas yang berjalan dalam |
| GetAsync(IFuture, Int64, TimeUnit) |
Kelas dasar abstrak untuk tugas yang berjalan dalam |