Quais são as vantagens / razões para usar um manipulador e não um thread?
Um manipulador permite enviar e processar mensagens e Runnableobjetos associados a um encadeamento MessageQueue. Cada Handlerinstâ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 ThreadPoolExecutorou ExecutorServiceAPI.
(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 AsyncTaske HandlerThreadnão é uma classe apropriada. A natureza de thread único AsyncTasktransformaria todo o trabalho em thread em um sistema linear. O uso da HandlerThreadclasse, 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 Handlercomo executar várias instâncias Runnable. Nesse caso, todas as Runnabletarefas serão executadas em um único thread.
Android: Brinde em um tópico