Um thread daemon é um thread em segundo plano de baixa prioridade que não impede a saída da JVM quando o programa termina a execução
- Threads daemon são executados em segundo plano para oferecer suporte a threads de usuário.
- A JVM é encerrada automaticamente quando todos os threads do usuário (não daemon) são concluídos.
- Eles são criados usando a mesma classe Thread, mas são marcados como daemon usando o método setDaemon(true).
- O método setDaemon(true) deve ser chamado antes do thread ser iniciado.
- Exemplos comuns incluem Garbage Collector e Finalizer Thread.
Sintaxe
Javathread.setDaemon(true);
Casos de uso
- Coleta de lixo: O Garbage Collector (GC) em Java é executado como um thread daemon.
- Monitoramento em segundo plano: Threads daemon podem monitorar o estado dos recursos ou conexões dos componentes do aplicativo.
- Serviços de registro e auditoria: Threads daemon podem ser usados para registrar atividades em segundo plano continuamente.
- Operações de limpeza: Threads daemon podem limpar periodicamente arquivos temporários, liberar recursos não utilizados ou realizar limpeza de cache.
- Tarefas do agendador ou temporizador: Os agendadores em segundo plano geralmente usam threads daemon para acionar tarefas em intervalos fixos.
Métodos usados
- void setDaemon(booleano ativado): Marca um thread como daemon ou thread de usuário. Deve ser chamado antes de start().
- booleano isDaemon(): Verifica se um thread é daemon.
Criando um Thread Daemon
Javapublic class DaemonExample extends Thread { public void run() { if (Thread.currentThread().isDaemon()) { System.out.println('Daemon thread running...'); } else { System.out.println('User thread running...'); } } public static void main(String[] args) { DaemonExample t1 = new DaemonExample(); DaemonExample t2 = new DaemonExample(); t1.setDaemon(true); // must be set before start() t1.start(); t2.start(); } }
Saída
Daemon thread running... User thread running...
Comportamento do Daemon Thread
Javapublic class DaemonBehavior extends Thread { public void run() { while (true) { System.out.println('Daemon thread running...'); } } public static void main(String[] args) { DaemonBehavior t = new DaemonBehavior(); t.setDaemon(true); t.start(); System.out.println('Main (user) thread ends...'); } }
Saída
Main (user) thread ends...
A JVM termina imediatamente após o encadeamento principal terminar, mesmo que o encadeamento daemon ainda esteja em execução.
Notas importantes
- Um thread herda o status do daemon do thread que o cria.
- O método setDaemon(true) lança IllegalThreadStateException se chamado após start().
- Threads daemon não devem ser usados para tarefas que exigem conclusão, como gravação em um arquivo ou atualização de um banco de dados.
- A JVM encerra todos os threads do daemon abruptamente sem realizar operações de limpeza.
Diferença entre thread de usuário e thread de daemon
| Base | Tópico do usuário | Tópico Daemon |
|---|---|---|
| Propósito | Executa as principais tarefas do aplicativo | Executa serviços em segundo plano |
| Vida útil | Mantém a JVM ativa até terminar | Termina quando todos os threads do usuário terminam |
| Prioridade | Geralmente mais alto | Geralmente mais baixo |
| Saída JVM | JVM aguarda conclusão | JVM sai mesmo em execução |
| Exemplos | Threads de trabalho do thread principal | Monitores de fundo do coletor de lixo |