Quali sono i vantaggi / i motivi per usare un gestore e non un thread?
Un gestore consente di inviare ed elaborare messaggi e Runnableoggetti associati a un thread MessageQueue. Ogni Handleristanza è associata a un singolo thread e alla coda dei messaggi di quel thread.
Quando si crea un nuovo Handler, viene associato alla coda thread / messaggi del thread che lo sta creando - da quel momento in poi, consegnerà i messaggi e i runnable a quella coda messaggi ed eseguirli quando escono dalla coda messaggi .
Esistono due usi principali per un gestore:
- Per programmare messaggi e Runnable da eseguire come punto futuro
- Per accodare un'azione da eseguire su un thread diverso dal vostro.
Se usi i thread Java, devi gestire qualcosa da solo: sincronizzare con il thread principale, cancellare un thread ecc.
Questo singolo thread non crea un pool di thread a meno che tu non usi ThreadPoolExecutoro ExecutorServiceAPI.
(Preso questa query dai tuoi commenti sulla risposta Blackbelt)
Perché non usare un Executor? e anche se volessi usare un Handler per farlo, come?
Riferimento: articolo sulle prestazioni del thread
Esistono alcuni tipi di lavoro che possono essere ridotti a compiti altamente paralleli e distribuiti. Con l'enorme volume di pacchetti di lavoro questo crea AsyncTaske HandlerThreadnon sono classi appropriate. La natura a thread singolo AsyncTasktrasformerebbe tutto il lavoro pool di thread in un sistema lineare. L'uso della HandlerThreadclasse, d'altra parte, richiederebbe al programmatore di gestire manualmente il bilanciamento del carico tra un gruppo di thread.
ThreadPoolExecutor è una classe di supporto per semplificare questo processo. Questa classe gestisce la creazione di un gruppo di thread, stabilisce le loro priorità e gestisce il modo in cui il lavoro viene distribuito tra quei thread. Man mano che il carico di lavoro aumenta o diminuisce, la classe gira o distrugge più thread per adattarsi al carico di lavoro.
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);
Puoi fare riferimento a questo articolo della guida per sviluppatori su create-threadpool per maggiori dettagli.
Dai un'occhiata a questo post per l'utilizzo di Handlereseguire più istanze eseguibili. In questo caso, tutte le Runnableattività verranno eseguite in un singolo thread.
Android: brindisi in un thread