Quali sono i vantaggi / i motivi per usare un gestore e non un thread?
Un gestore consente di inviare ed elaborare messaggi e Runnable
oggetti associati a un thread MessageQueue
. Ogni Handler
istanza è 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 ThreadPoolExecutor
o ExecutorService
API.
(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 AsyncTask
e HandlerThread
non sono classi appropriate. La natura a thread singolo AsyncTask
trasformerebbe tutto il lavoro pool di thread in un sistema lineare. L'uso della HandlerThread
classe, 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 Handler
eseguire più istanze eseguibili. In questo caso, tutte le Runnable
attività verranno eseguite in un singolo thread.
Android: brindisi in un thread