Alguém pode me dizer quais são os threads do daemon em Java ?
java
multithreading
roqueiro
fonte
fonte
Thread
javadoc descreve o que são: java.sun.com/javase/6/docs/api/java/lang/Thread.htmlRespostas:
Um encadeamento daemon é um encadeamento que não impede que a JVM saia quando o programa termina, mas o encadeamento ainda está em execução. Um exemplo para um encadeamento daemon é a coleta de lixo.
Você pode usar o
setDaemon(boolean)
método para alterar asThread
propriedades do daemon antes do início do encadeamento.fonte
setDamon(boolean)
só pode ser chamado antes do início do encadeamento. Por padrão, o encadeamento herda o status do daemon de seu encadeamento pai.thread that does not prevent the JVM from exiting when the program finishes but the thread is still running
basicamente significa que o processo da JVM que iniciou o encadeamento não se importa se o encadeamento daemon terminou a execução ou não, apenas terminará se todos os encadeamentos normais concluírem a execução.Mais alguns pontos (Referência: Concorrência Java na Prática )
Quando todos os encadeamentos que não são daemon são concluídos, a JVM é interrompida e todos os encadeamentos restantes do daemon são abandonados :
Por esse motivo, os encadeamentos daemon devem ser usados com moderação e é perigoso usá-los para tarefas que possam executar qualquer tipo de E / S.
fonte
finally
bloco é executado, independentemente de os encadeamentos serem daemon ou não. Portanto, não ligueSystem.exit(…)
se você acha que pode haver threads executando E / S. A única diferença é que a JVM acionará sua própria finalização quando apenas os encadeamentos daemon forem deixados.Todas as respostas acima são boas. Aqui está um pequeno trecho de código simples, para ilustrar a diferença. Experimente com cada um dos valores de true e false em
setDaemon
.fonte
Tradicionalmente, os processos de daemon no UNIX eram aqueles que estavam constantemente em execução em segundo plano, como os serviços no Windows.
Um encadeamento daemon em Java é aquele que não impede a saída da JVM. Especificamente, a JVM será encerrada quando apenas os encadeamentos daemon permanecerem. Você cria um chamando o
setDaemon()
método emThread
.Leia os tópicos do Daemon .
fonte
Os encadeamentos daemon são como prestadores de serviços para outros encadeamentos ou objetos em execução no mesmo processo que o encadeamento daemon. Os encadeamentos daemon são usados para tarefas de suporte em segundo plano e são necessários apenas enquanto os encadeamentos normais estão em execução. Se os threads normais não estiverem em execução e os threads restantes forem daemon, o intérprete será encerrado.
Por exemplo, o navegador HotJava usa até quatro encadeamentos de daemon chamados "Image Fetcher" para buscar imagens do sistema de arquivos ou da rede para qualquer encadeamento que precise de um.
Os encadeamentos daemon geralmente são usados para executar serviços para seu aplicativo / applet (como carregar os "bits do fiddley"). A principal diferença entre os encadeamentos do usuário e daemon é que a JVM encerrará um programa apenas quando todos os encadeamentos do usuário forem finalizados. Os encadeamentos daemon são finalizados pela JVM quando não há mais encadeamentos de usuário em execução, incluindo o encadeamento principal de execução.
setDaemon (verdadeiro / falso)? Este método é usado para especificar que um thread é um daemon.
public boolean isDaemon ()? Este método é usado para determinar se o encadeamento é daemon ou não.
Por exemplo:
Resultado:
fonte
Definição de Daemon (Computação):
—— Fonte: Inglês por Oxford Dictionaries
O que é o thread do Daemon em Java?
fonte
Um encadeamento daemon é um encadeamento considerado como executando algumas tarefas em segundo plano, como manipular solicitações ou vários chronjobs que podem existir em um aplicativo.
Quando seu programa tiver apenas threads daemon restantes, ele será encerrado. Isso ocorre porque geralmente esses threads funcionam em conjunto com threads normais e fornecem manipulação de eventos em segundo plano.
Você pode especificar que a
Thread
é um daemon usando osetDaemon
método, eles geralmente não saem, nem são interrompidos. Eles apenas param quando o aplicativo para.fonte
Gostaria de esclarecer um equívoco:
fonte
Threads do Daemon e Threads do Usuário. Geralmente todos os encadeamentos criados pelo programador são encadeamentos de usuário (a menos que você o especifique como daemon ou seu encadeamento pai é um encadeamento de daemon). O encadeamento do usuário geralmente serve para executar nosso código de programa. A JVM não termina, a menos que todo o encadeamento do usuário seja finalizado.
fonte
Java possui um tipo especial de encadeamento chamado daemon thread.
Para que são utilizados os threads do daemon?
Normalmente usado como provedor de serviços para threads normais. Geralmente, há um loop infinito que aguarda a solicitação de serviço ou executa as tarefas do encadeamento. Eles não podem fazer trabalhos importantes. (Como não sabemos quando eles terão tempo de CPU e poderão terminar a qualquer momento, se não houver outros threads em execução.)
Um exemplo típico desse tipo de encadeamento é o coletor de lixo Java .
Tem mais...
setDaemon()
método apenas antes de chamá-lostart()
. Depois que o encadeamento estiver em execução, você não poderá modificar o status do daemon.isDaemon()
método para verificar se um thread é um daemon ou um usuário.fonte
Threads daemon são como assistentes. Threads que não são daemon são como executores frontais. Os assistentes ajudam os artistas a concluir um trabalho. Quando o trabalho é concluído, os artistas não precisam mais de ajuda para executá-lo. Como nenhuma ajuda é necessária, os assistentes deixam o local. Portanto, quando os trabalhos dos encadeamentos não-Daemon terminam, os encadeamentos do Daemon marcham.
fonte
O encadeamento daemon é exatamente como um encadeamento normal, exceto que a JVM será encerrada apenas quando os outros encadeamentos que não são daemon não existirem. Os encadeamentos daemon geralmente são usados para executar serviços para seu aplicativo.
fonte
O encadeamento daemon em Java é o encadeamento executado em segundo plano e criado principalmente pela JVM para executar tarefas em segundo plano, como coleta de lixo e outras tarefas de manutenção doméstica.
Pontos a serem observados:
Qualquer encadeamento criado pelo encadeamento principal, que executa o método principal em Java, por padrão, não é daemon porque o Thread herda sua natureza do daemon do Thread que o cria, como o Thread pai, e como o thread principal é um thread que não é daemon, qualquer outro thread criado a partir dele. permaneça não-daemon até que seja explicitamente criado daemon chamando setDaemon (true).
Thread.setDaemon (true) cria um daemon Thread, mas ele só pode ser chamado antes de iniciar o Thread em Java. Ele lançará IllegalThreadStateException se o Thread correspondente já estiver iniciado e em execução.
Diferença entre o thread Daemon e Non Daemon em Java:
1) A JVM não espera que nenhum encadeamento daemon seja concluído antes de existir.
2) O Daemon Thread é tratado de forma diferente do User Thread quando a JVM termina, finalmente os blocos não são chamados, as pilhas não são desenroladas e a JVM acaba de sair.
fonte
Em Java, os Daemon Threads são um dos tipos de threads que não impedem a saída da Java Virtual Machine (JVM). O principal objetivo de um encadeamento daemon é executar uma tarefa em segundo plano, especialmente no caso de alguma tarefa ou trabalho periódico de rotina. Com saídas da JVM, o encadeamento daemon também morre.
Ao definir a
thread.setDaemon(true)
, um encadeamento se torna um encadeamento daemon. No entanto, você só pode definir esse valor antes do início do encadeamento.fonte
Aqui está um exemplo para testar o comportamento dos encadeamentos daemon no caso de saída da jvm devido à inexistência de encadeamentos do usuário.
Observe a segunda última linha na saída abaixo, quando o thread principal foi encerrado, o daemon thread também morreu e não imprimiu a instrução finalmente executada9 no bloco finalmente. Isso significa que qualquer recurso de E / S fechado no bloco finalmente de um encadeamento daemon não será fechado se a JVM sair devido à inexistência de encadeamentos do usuário.
Resultado
fonte
Os encadeamentos do daemon são como todos explicaram, não restringirão a JVM a sair, portanto, basicamente, é um encadeamento feliz para o Aplicativo do ponto de vista de saída.
Deseja adicionar que os encadeamentos daemon possam ser usados quando, digamos, eu estiver fornecendo uma API, como enviar dados para um servidor de terceiros / ou JMS, talvez seja necessário agregar dados no nível da JVM do cliente e depois enviar para o JMS em um encadeamento separado. Eu posso fazer esse encadeamento como encadeamento daemon, se esse não for um dado obrigatório a ser enviado ao servidor. Esse tipo de dados é como push / agregação de log.
Atenciosamente, Manish
fonte
O encadeamento daemon é como o processo do daemon responsável pelo gerenciamento de recursos; um encadeamento daemon é criado pela Java VM para atender aos encadeamentos do usuário. Por exemplo, sistema de atualização para unix, unix é um processo daemon. o filho do thread daemon é sempre o daemon thread, portanto, por padrão, o daemon é false. você pode verificar o thread como daemon ou usuário usando o método "isDaemon ()". portanto, o daemon thread ou o processo daemon são basicamente responsáveis pelo gerenciamento de recursos. por exemplo, ao iniciar a jvm, há um coletor de lixo em execução que é um encadeamento daemon cuja prioridade é 1 que é mais baixa, que está gerenciando a memória. jvm está ativo enquanto o thread do usuário estiver ativo, você não pode matar o daemon thread.jvm é responsável por matar os threads do daemon.
fonte
Vamos falar apenas em código com exemplos de trabalho. Eu gosto da resposta de russ acima, mas para remover qualquer dúvida que tenha, aprimorei-a um pouco. Eu o executei duas vezes, uma vez com o segmento de trabalho definido como deamon true (segmento de deamon) e outro tempo definido como false (segmento de usuário). Confirma que o encadeamento do deamon termina quando o encadeamento principal termina.
fonte
Os encadeamentos daemon são geralmente conhecidos como encadeamento "Service Provider". Esses encadeamentos não devem ser usados para executar o código do programa, mas o código do sistema. Esses threads são paralelos ao seu código, mas a JVM pode matá-los a qualquer momento. Quando a JVM não encontra encadeamentos de usuário, ele o interrompe e todos os encadeamentos do daemon terminam instantaneamente. Podemos definir um segmento que não seja daemon como daemon usando:
fonte
Os encadeamentos daemon são encadeamentos executados em segundo plano, enquanto outros encadeamentos não daemon do processo ainda estiverem em execução. Assim, quando todos os encadeamentos não daemon são concluídos, os encadeamentos do daemon são encerrados. Um exemplo para o encadeamento não daemon é o encadeamento executando o Main. Um encadeamento é criado daemon chamando o
setDaemon()
método antes que o encadeamento seja iniciadoPara obter mais referência: Thread daemon em Java
fonte
Para mim, o daemon thread é como um administrador para os threads do usuário. Se todos os encadeamentos do usuário forem concluídos, o encadeamento daemon não terá trabalho e será morto pela JVM. Eu expliquei isso no vídeo do YouTube .
fonte
A JVM executará o trabalho quando uma última execução de encadeamento não daemon for concluída. Por padrão, JVM irá criar um thread como nondaemon mas podemos fazer o Tópico como um daemon com a ajuda do método
setDaemon(true)
. Um bom exemplo de encadeamento do Daemon é o encadeamento GC, que concluirá seu trabalho assim que todos os encadeamentos não daemon forem concluídos.fonte
Os threads do daemon morrem quando o thread do criador sai.
Threads que não são daemon (padrão) podem viver mais que o thread principal.
fonte
join
edição do encadeamento em primeiro plano , o daemon permanecerá enquanto o encadeamento principal for executado.