Daemon Threads em Java
1. Visão geral
Neste breve artigo, vamos dar uma olhada nos threads daemon em Java e ver para que eles podem ser usados. Também explicaremos a diferença entre threads daemon e threads do usuário.
2. Diferença entre Daemon e Threads do Usuário
Java oferece dois tipos de threads: threads do usuário e daemon.
Threads de usuário são threads de alta prioridade. The JVM will wait for any user thread to complete its task before terminating it.
Por outro lado,daemon threads are low-priority threads whose only role is to provide services to user threads.
Uma vez que os encadeamentos daemon destinam-se a atender aos encadeamentos do usuário e são necessários apenas enquanto os encadeamentos do usuário estão em execução, eles não impedirão que a JVM saia depois que todos os encadeamentos do usuário concluírem sua execução.
É por isso que os loops infinitos, que normalmente existem em threads daemon, não causarão problemas, porque qualquer código, incluindo os blocosfinally, não será executado uma vez que todas as threads do usuário tenham terminado sua execução. Por esse motivo,daemon threads are not recommended for I/O tasks.
No entanto, existem exceções a esta regra. Código mal projetado nos encadeamentos daemon pode impedir a saída da JVM. Por exemplo, chamarThread.join() em um encadeamento daemon em execução pode bloquear o desligamento do aplicativo.
3. Usos de Daemon Threads
Os encadeamentos daemon são úteis para tarefas de suporte em segundo plano, como coleta de lixo, liberação de memória de objetos não utilizados e remoção de entradas indesejadas do cache. A maioria dos encadeamentos da JVM são daemon.
4. Criando um Daemon Thread
Para definir um thread para ser um thread daemon, tudo o que precisamos fazer é chamarThread.setDaemon(). Neste exemplo, usaremos a classeNewThread que estende a classeThread:
NewThread daemonThread = new NewThread();
daemonThread.setDaemon(true);
daemonThread.start();
Any thread inherits the daemon status of the thread that created it. Visto que o thread principal é um thread do usuário, qualquer thread criado dentro do método principal é, por padrão, um thread do usuário.
O métodosetDaemon() só pode ser chamado depois que o objetoThread foi criado e o encadeamento não foi iniciado. Uma tentativa de chamarsetDaemon() enquanto um thread está sendo executado lançará umIllegalThreadStateException:
@Test(expected = IllegalThreadStateException.class)
public void whenSetDaemonWhileRunning_thenIllegalThreadStateException() {
NewThread daemonThread = new NewThread();
daemonThread.start();
daemonThread.setDaemon(true);
}
5. Verificando se um thread é um thread daemon
Finalmente, para verificar se um thread é um thread daemon, podemos simplesmente chamar o métodoisDaemon():
@Test
public void whenCallIsDaemon_thenCorrect() {
NewThread daemonThread = new NewThread();
NewThread userThread = new NewThread();
daemonThread.setDaemon(true);
daemonThread.start();
userThread.start();
assertTrue(daemonThread.isDaemon());
assertFalse(userThread.isDaemon());
}
6. Conclusão
Neste tutorial rápido, vimos o que são threads daemon e para que podem ser usados em alguns cenários práticos.
Como sempre, a versão completa do código está disponívelover on GitHub.