Apa keuntungan / alasan menggunakan Handler dan bukan Thread?
Sebuah Handler memungkinkan Anda untuk mengirim dan proses Pesan dan Runnable
benda yang berhubungan dengan thread ini MessageQueue
. Setiap Handler
instance dikaitkan dengan utas tunggal dan antrian pesan utas itu.
Saat Anda membuat yang baru Handler
, ia terikat ke antrian utas / pesan dari utas yang membuatnya - sejak saat itu, ia akan mengirimkan pesan dan runnables ke antrian pesan itu dan menjalankannya saat keluar dari antrian pesan .
Ada dua kegunaan utama untuk Handler:
- Untuk menjadwalkan pesan dan Runnables akan dieksekusi sebagai titik di masa depan
- Untuk enqueue tindakan yang akan dilakukan pada thread yang berbeda dari Anda sendiri.
Jika Anda menggunakan utas java, Anda harus menangani sesuatu sendiri - menyinkronkan dengan utas utama, membatalkan utas dll.
Utas tunggal ini tidak membuat kumpulan utas kecuali Anda menggunakan ThreadPoolExecutor
atau ExecutorService
API.
(Ambil permintaan ini dari komentar Anda pada jawaban Blackbelt)
Mengapa tidak menggunakan Pelaksana? dan bahkan jika saya ingin menggunakan Handler untuk melakukan itu, bagaimana?
Referensi: Artikel Kinerja Utas
Ada beberapa jenis pekerjaan yang dapat direduksi menjadi tugas yang sangat paralel dan terdistribusi. Dengan banyaknya paket kerja yang diciptakan, AsyncTask
dan HandlerThread
ini bukan kelas yang sesuai. Sifat single-threaded AsyncTask
akan mengubah semua pekerjaan threadpool menjadi sistem linier. Menggunakan HandlerThread
kelas, di sisi lain, akan membutuhkan programmer untuk secara manual mengelola load balancing antara sekelompok thread.
ThreadPoolExecutor adalah kelas pembantu untuk membuat proses ini lebih mudah. Kelas ini mengelola pembuatan sekelompok utas, menetapkan prioritas mereka, dan mengelola bagaimana pekerjaan didistribusikan di antara utas tersebut. Saat beban kerja bertambah atau berkurang, kelas berputar atau menghancurkan lebih banyak utas untuk menyesuaikan dengan beban kerja.
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
Anda bisa merujuk ke artikel panduan pengembang ini di create-threadpool untuk detail lebih lanjut.
Lihat posting ini untuk penggunaan Handler
menjalankan beberapa instance Runnable. Dalam hal ini, semua Runnable
tugas akan berjalan dalam satu utas.
Android: Bersulang di utas