Apa keuntungan / alasan menggunakan Handler dan bukan Thread?
Sebuah Handler memungkinkan Anda untuk mengirim dan proses Pesan dan Runnablebenda yang berhubungan dengan thread ini MessageQueue. Setiap Handlerinstance 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 ThreadPoolExecutoratau ExecutorServiceAPI.
(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, AsyncTaskdan HandlerThreadini bukan kelas yang sesuai. Sifat single-threaded AsyncTaskakan mengubah semua pekerjaan threadpool menjadi sistem linier. Menggunakan HandlerThreadkelas, 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 Handlermenjalankan beberapa instance Runnable. Dalam hal ini, semua Runnabletugas akan berjalan dalam satu utas.
Android: Bersulang di utas