¿Cuáles son las ventajas / razones para usar un controlador y no un hilo?
Un controlador le permite enviar y procesar mensajes y Runnable
objetos asociados con un hilo MessageQueue
. Cada Handler
instancia está asociada con un solo hilo y la cola de mensajes de ese hilo.
Cuando creas un nuevo Handler
, está vinculado a la cola de hilo / mensaje del hilo que lo está creando; a partir de ese momento, enviará mensajes y ejecutables a esa cola de mensajes y los ejecutará a medida que salgan de la cola de mensajes. .
Hay dos usos principales para un controlador:
- Para programar mensajes y Runnables para que se ejecuten en algún momento en el futuro
- Para poner en cola una acción que se realizará en un hilo diferente al suyo.
Si usa hilos Java, debe manejar algunas cosas por su cuenta: sincronizar con el hilo principal, cancelar un hilo, etc.
Este subproceso único no crea un grupo de subprocesos a menos que use ThreadPoolExecutor
o ExecutorService
API.
(Tomó esta consulta de sus comentarios sobre la respuesta de Blackbelt)
¿Por qué no usar un ejecutor? e incluso si quisiera usar un controlador para hacer eso, ¿cómo?
Referencia: artículo sobre rendimiento de subprocesos
Hay ciertos tipos de trabajo que pueden reducirse a tareas altamente paralelas y distribuidas. Con el gran volumen de paquetes de trabajo que esto crea, AsyncTask
y HandlerThread
no son clases apropiadas. La naturaleza de un solo subproceso AsyncTask
convertiría todo el trabajo combinado en un sistema lineal. El uso de la HandlerThread
clase, por otro lado, requeriría que el programador gestione manualmente el equilibrio de carga entre un grupo de subprocesos.
ThreadPoolExecutor es una clase auxiliar para facilitar este proceso. Esta clase gestiona la creación de un grupo de subprocesos, establece sus prioridades y gestiona cómo se distribuye el trabajo entre esos subprocesos. A medida que la carga de trabajo aumenta o disminuye, la clase gira o destruye más hilos para ajustarse a la carga de trabajo.
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);
Puede consultar este artículo de la guía del desarrollador en create-threadpool para obtener más detalles.
Eche un vistazo a esta publicación para Handler
usarla para ejecutar varias instancias Runnable. En este caso, todas las Runnable
tareas se ejecutarán en un solo subproceso.
Android: tostadas en un hilo