Bagikan melalui


ForkJoinTask Kelas

Definisi

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
ForkJoinTask
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 .Object

(Diperoleh dari Object)
Exception

Mengembalikan pengecualian yang dilemparkan oleh komputasi dasar, atau CancellationException jika dibatalkan, atau null jika tidak ada atau jika metode belum selesai.

ForkJoinTaskTag

Mengembalikan tag untuk tugas ini.

Handle

Handel ke instans Android yang mendasar.

(Diperoleh dari Object)
IsCancelled

Mengembalikan true jika tugas ini dibatalkan sebelum selesai secara normal.

IsCompletedAbnormally

Mengembalikan true jika tugas ini melemparkan pengecualian atau dibatalkan.

IsCompletedNormally

Mengembalikan true jika tugas ini selesai tanpa melemparkan pengecualian dan tidak dibatalkan.

IsDone

Mengembalikan true jika tugas ini selesai.

JniIdentityHashCode

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

(Diperoleh dari Object)
JniPeerMembers

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

PeerReference

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

(Diperoleh dari Object)
Pool

Mengembalikan kumpulan yang menghosting utas saat ini, atau null jika utas saat ini dijalankan di luar ForkJoinPool mana pun.

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 null jika tugas ini tidak diketahui telah selesai.

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 call metode yang diberikan Callable sebagai tindakannya, dan mengembalikan hasilnya setelah #join, menerjemahkan pengecualian yang diperiksa yang ditemui ke dalam RuntimeException.ForkJoinTask

Adapt(IRunnable)

Mengembalikan baru ForkJoinTask yang melakukan run metode yang diberikan Runnable sebagai tindakannya, dan mengembalikan hasil null pada #join.

Adapt(IRunnable, Object)

Mengembalikan baru ForkJoinTask yang melakukan run metode yang diberikan Runnable sebagai tindakannya, dan mengembalikan hasil yang diberikan pada #join.

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 join operasi terkait.

CompleteExceptionally(Throwable)

Menyelesaikan tugas ini secara tidak normal, dan jika belum dibatalkan atau dibatalkan, menyebabkannya melemparkan pengecualian yang diberikan pada join dan operasi terkait.

Dispose()

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

(Diperoleh dari Object)
Dispose(Boolean)

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

(Diperoleh dari Object)
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 ForkJoinPool#commonPool() jika tidak #inForkJoinPool.

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 true saat ini adalah ForkJoinWorkerThread eksekusi sebagai komputasi ForkJoinPool.

Invoke()

Memulai melakukan tugas ini, menunggu penyelesaiannya jika perlu, dan mengembalikan hasilnya, atau melempar (tidak dicentang) RuntimeException atau Error jika komputasi yang mendasar melakukannya.

InvokeAll(ForkJoinTask, ForkJoinTask)

Fork tugas yang diberikan, kembali saat isDone penangguhan untuk setiap tugas atau pengecualian (tidak dicentang) ditemui, dalam hal ini pengecualian ditumbuhi kembali.

InvokeAll(ForkJoinTask[])

Fork semua tugas dalam koleksi yang ditentukan, kembali saat isDone penangguhan untuk setiap tugas atau pengecualian (tidak dicentang) ditemui, dalam hal ini pengecualian ditumbuhi kembali.

InvokeAll(ICollection)

Fork semua tugas dalam koleksi yang ditentukan, kembali saat isDone penangguhan untuk setiap tugas atau pengecualian (tidak dicentang) ditemui, dalam hal ini pengecualian ditumbuhi kembali.

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 fork.

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 ForkJoinPool.

(Diperoleh dari Object)
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 ForkJoinPool.

(Diperoleh dari Object)
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 ForkJoinPool.

(Diperoleh dari Object)
IJavaPeerable.DisposeUnlessReferenced()

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

(Diperoleh dari Object)
IJavaPeerable.Finalized()

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

(Diperoleh dari Object)
IJavaPeerable.JniManagedPeerState

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

(Diperoleh dari Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

(Diperoleh dari Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

(Diperoleh dari Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

(Diperoleh dari Object)

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 ForkJoinPool.

GetJniTypeName(IJavaPeerable)

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

GetAsync(IFuture)

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

GetAsync(IFuture, Int64, TimeUnit)

Kelas dasar abstrak untuk tugas yang berjalan dalam ForkJoinPool.

Berlaku untuk