Quels sont les avantages / raisons d'utiliser un gestionnaire et non un thread?
Un gestionnaire vous permet d'envoyer et de traiter des messages et des Runnable
objets associés à un thread MessageQueue
. Chaque Handler
instance est associée à un seul thread et à la file d'attente de messages de ce thread.
Lorsque vous créez un nouveau Handler
, il est lié au thread / file d'attente de messages du thread qui le crée - à partir de ce moment, il remettra les messages et les exécutables à cette file d'attente de messages et les exécutera lorsqu'ils sortent de la file d'attente de messages. .
Il existe deux utilisations principales pour un gestionnaire:
- Pour planifier les messages et les exécutables à exécuter à un moment donné dans le futur
- Pour mettre en file d' attente une action à effectuer sur un thread différent du vôtre.
Si vous utilisez des threads java, vous devez gérer vous-même quelque chose - la synchronisation avec le thread principal, l'annulation d'un thread, etc.
Ce thread unique ne crée pas de pool de threads sauf si vous utilisez ThreadPoolExecutor
ou ExecutorService
API.
(Tiré de cette requête de vos commentaires sur la réponse Blackbelt)
Pourquoi ne pas utiliser un exécuteur? et même si je voulais utiliser un Handler pour faire ça, comment?
Référence: article Thread Performance
Il existe certains types de travail qui peuvent être réduits à des tâches hautement parallèles et distribuées. Avec le volume de paquets de travail que cela crée, AsyncTask
et HandlerThread
ne sont pas des classes appropriées. La nature AsyncTask
monothread de transformerait tout le travail threadpool en un système linéaire. L'utilisation de la HandlerThread
classe, en revanche, nécessiterait que le programmeur gère manuellement l'équilibrage de charge entre un groupe de threads.
ThreadPoolExecutor est une classe d'assistance pour faciliter ce processus. Cette classe gère la création d'un groupe de threads, définit leurs priorités et gère la répartition du travail entre ces threads. À mesure que la charge de travail augmente ou diminue, la classe tourne ou détruit davantage de threads pour s'adapter à la charge de travail.
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);
Vous pouvez consulter cet article du guide du développeur sur create-threadpool pour plus de détails.
Jetez un œil à cet article pour l'utilisation de Handler
pour exécuter plusieurs instances exécutables. Dans ce cas, toutes les Runnable
tâches seront exécutées dans un seul thread.
Android: Toast dans un fil