Di RxJava ada 5 penjadwal berbeda untuk dipilih:
direct () : Membuat dan mengembalikan Penjadwal yang menjalankan pekerjaan segera di utas saat ini.
trampoline () : Membuat dan mengembalikan Penjadwal yang antrean bekerja di utas saat ini untuk dieksekusi setelah pekerjaan saat ini selesai.
newThread () : Membuat dan mengembalikan Penjadwal yang membuat Thread baru untuk setiap unit kerja.
perhitungan () : Membuat dan mengembalikan Penjadwal yang dimaksudkan untuk pekerjaan komputasi. Ini dapat digunakan untuk acara-loop, memproses panggilan balik dan pekerjaan komputasi lainnya. Jangan melakukan pekerjaan yang terikat IO pada penjadwal ini. Gunakan Penjadwal. io () sebagai gantinya.
io () : Membuat dan mengembalikan Penjadwal yang ditujukan untuk pekerjaan yang terikat IO. Implementasi didukung oleh thread-pelaksana yang akan tumbuh sesuai kebutuhan. Ini dapat digunakan untuk melakukan pemblokiran IO secara asinkron. Jangan melakukan pekerjaan komputasi pada penjadwal ini. Gunakan Penjadwal. perhitungan () sebagai gantinya.
Pertanyaan:
3 penjadwal pertama cukup jelas; Namun, saya agak bingung tentang perhitungan dan io .
- Apa sebenarnya "pekerjaan terikat IO"? Apakah ini digunakan untuk berurusan dengan stream (
java.io
) dan file (java.nio.files
)? Apakah ini digunakan untuk permintaan basis data? Apakah ini digunakan untuk mengunduh file atau mengakses REST API? - Apa perbedaan komputasi () dengan newThread () ? Apakah itu semua perhitungan () panggilan berada di utas tunggal (latar belakang) alih-alih utas baru (latar belakang) setiap kali?
- Mengapa memanggil komputasi itu buruk () ketika melakukan IO bekerja buruk?
- Mengapa memanggil io () saat melakukan pekerjaan komputasi itu buruk ?
timeout
secara default padacomputation()
Anda akan memblokir utas tetapi bukan itu masalahnya. Di bawah selimutcomputation()
menggunakan tindakanScheduledExecutorService
sehingga waktu tertunda tidak menghalangi. Mengingat fakta inicomputation()
adalah ide yang baik karena jika berada di utas lain maka kita akan dikenakan biaya penggantian ulir.Poin yang paling penting adalah bahwa kedua penjadwal.io dan Penjadwal.komputasi didukung oleh kumpulan utas yang tidak terikat sebagai lawan dari yang lain yang disebutkan dalam pertanyaan. Karakteristik ini hanya dibagikan oleh Schedulers.from (Executor) dalam hal Executor dibuat dengan newCachedThreadPool (tidak terikat dengan kumpulan utas reklamasi otomatis).
Sebagaimana banyak dijelaskan dalam tanggapan sebelumnya dan beberapa artikel di web, Penjadwal.io dan Penjadwal. Perhitungan harus digunakan dengan hati-hati karena mereka dioptimalkan untuk jenis pekerjaan atas nama mereka. Tapi, menurut saya, peran mereka yang paling penting adalah memberikan konkurensi nyata ke aliran reaktif .
Bertentangan dengan kepercayaan pendatang baru, aliran reaktif tidak secara bersamaan berbarengan tetapi secara inheren tidak sinkron dan berurutan. Karena alasan ini, Schedulers.io hanya akan digunakan ketika operasi I / O memblokir (misalnya: menggunakan perintah pemblokiran seperti Apache IOUtils FileUtils.readFileAsString (...) ) sehingga akan membekukan utas panggilan sampai operasi selesai
Menggunakan metode asinkron seperti Java AsynchronousFileChannel (...) tidak akan memblokir utas panggilan selama operasi sehingga tidak ada gunanya menggunakan utas terpisah. Bahkan, Schedulers.io thread sebenarnya tidak cocok untuk operasi asinkron karena mereka tidak menjalankan loop acara dan panggilan balik tidak akan pernah ... dipanggil.
Logika yang sama berlaku untuk akses basis data atau panggilan API jarak jauh. Jangan gunakan Schedulers.io jika Anda dapat menggunakan API asinkron atau reaktif untuk melakukan panggilan.
Kembali ke konkurensi. Anda mungkin tidak memiliki akses ke async atau API reaktif untuk melakukan operasi I / O secara serempak atau serempak, jadi satu-satunya alternatif Anda adalah mengirim beberapa panggilan pada utas terpisah. Alas, Reaktif sungai yang berurutan di ujungnya tetapi kabar baiknya adalah bahwa para flatMap () operator dapat memperkenalkan concurrency di inti mereka .
Konkurensi harus dibangun dalam konstruk stream, biasanya menggunakan operator flatMap () . Operator yang kuat ini dapat dikonfigurasikan untuk secara internal menyediakan konteks multi-utas ke flatMap Anda () Fungsi yang tertanam <T, R>. Konteks itu disediakan oleh Penjadwal multi-utas seperti Penjadwal.io atau Penjadwal.komputasi .
Temukan detail lebih lanjut dalam artikel tentang Penjadwal dan Konkurensi RxJava2 di mana Anda akan menemukan contoh kode dan penjelasan terperinci tentang cara menggunakan Penjadwal secara berurutan dan bersamaan.
Semoga ini membantu,
Softjake
sumber
Posting blog ini memberikan jawaban yang sangat baik
Dari posting blog:
Schedulers.io () didukung oleh kumpulan utas tak terbatas. Ini digunakan untuk pekerjaan tipe I / O non-intensif CPU termasuk interaksi dengan sistem file, melakukan panggilan jaringan, interaksi basis data, dll. Kumpulan utas ini dimaksudkan untuk digunakan untuk melakukan pemblokiran IO secara asinkron.
Penjadwal.komputasi () didukung oleh kumpulan utas terbatas dengan ukuran hingga jumlah prosesor yang tersedia. Ini digunakan untuk pekerjaan komputasi atau CPU-intensif seperti mengubah ukuran gambar, memproses set data besar, dll. Berhati-hatilah: ketika Anda mengalokasikan lebih banyak thread komputasi daripada core yang tersedia, kinerja akan menurun karena pengalihan konteks dan overhead pembuatan thread saat thread bersaing untuk waktu prosesor.
Schedulers.newThread () membuat utas baru untuk setiap unit pekerjaan yang dijadwalkan. Penjadwal ini mahal karena utas baru muncul setiap kali dan tidak ada penggunaan ulang yang terjadi.
Schedulers.from (Pelaksana pelaksana) membuat dan mengembalikan penjadwal khusus yang didukung oleh pelaksana yang ditentukan. Untuk membatasi jumlah utas simultan di kumpulan utas, gunakan Scheduler.from (Executors.newFixedThreadPool (n)). Ini menjamin bahwa jika tugas dijadwalkan ketika semua utas ditempati, itu akan diantrekan. Utas di kumpulan akan ada sampai ditutup secara eksplisit.
Utas utama atau AndroidSchedulers.mainThread () disediakan oleh pustaka ekstensi RxAndroid ke RxJava. Utas utama (juga dikenal sebagai utas UI) adalah tempat interaksi pengguna terjadi. Harus berhati-hati untuk tidak membebani utas ini untuk mencegah UI yang tidak responsif atau, lebih buruk lagi, dialog Aplikasi Tidak Menanggapi ”(ANR).
Schedulers.single () adalah baru di RxJava 2. Penjadwal ini didukung oleh satu thread melaksanakan tugas secara berurutan dalam urutan yang diminta.
Schedulers.trampoline () menjalankan tugas dengan cara FIFO (Masuk Pertama, Keluar Pertama) oleh salah satu utas pekerja yang berpartisipasi. Ini sering digunakan saat menerapkan rekursi untuk menghindari bertambahnya tumpukan panggilan.
sumber