Quais são as vantagens / razões para usar um manipulador e não um thread?
Um manipulador permite enviar e processar mensagens e Runnable
objetos associados a um encadeamento MessageQueue
. Cada Handler
instância está associada a um único encadeamento e à fila de mensagens desse encadeamento.
Quando você cria um novo Handler
, ele é vinculado à fila de encadeamentos / mensagens do encadeamento que o está criando - a partir desse momento, ele envia mensagens e executáveis para essa fila de mensagens e as executa quando saem da fila de mensagens. .
Existem dois usos principais para um manipulador:
- Para agendar mensagens e Runnables a serem executados como algum ponto no futuro
- Para enfileirar uma ação a ser executada em um segmento diferente do seu.
Se você usa threads java, precisa lidar com algumas coisas sozinho - sincronizando com o thread principal, cancelando um thread etc.
Esse único thread não cria um pool de threads, a menos que você use ThreadPoolExecutor
ou ExecutorService
API.
(Retirou esta consulta dos seus comentários na resposta do Blackbelt)
Por que não usar um executor? e mesmo se eu quisesse usar um manipulador para fazer isso, como?
Referência: artigo Desempenho de Encadeamentos
Existem certos tipos de trabalho que podem ser reduzidos a tarefas distribuídas altamente paralelas. Com o grande volume de pacotes de trabalho, isso cria AsyncTask
e HandlerThread
não é uma classe apropriada. A natureza de thread único AsyncTask
transformaria todo o trabalho em thread em um sistema linear. O uso da HandlerThread
classe, por outro lado, exigiria que o programador gerencie manualmente o balanceamento de carga entre um grupo de threads.
ThreadPoolExecutor é uma classe auxiliar para facilitar esse processo. Essa classe gerencia a criação de um grupo de threads, define suas prioridades e gerencia como o trabalho é distribuído entre esses threads. À medida que a carga de trabalho aumenta ou diminui, a classe gira ou destrói mais threads para ajustar a carga de trabalho.
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);
Você pode consultar este artigo do guia do desenvolvedor sobre create-threadpool para obter mais detalhes.
Dê uma olhada nesta postagem para saber Handler
como executar várias instâncias Runnable. Nesse caso, todas as Runnable
tarefas serão executadas em um único thread.
Android: Brinde em um tópico