O que é um encadeamento daemon em Java?

809

Alguém pode me dizer quais são os threads do daemon em Java ?

roqueiro
fonte
20
O Threadjavadoc descreve o que são: java.sun.com/javase/6/docs/api/java/lang/Thread.html
skaffman
2
Para encadeamentos do Daemon, quando a JVM para, todos os encadeamentos do daemon são encerrados. Por esse motivo, os encadeamentos do daemon não devem ser usados ​​com frequência, pois a limpeza pode não ser executada neles. Por exemplo, qualquer E / S não sairia normalmente e gravaria / leria até o final.
precisa saber é o seguinte

Respostas:

631

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 as Threadpropriedades do daemon antes do início do encadeamento.

b_erb
fonte
210
Para a posteridade, 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.
Grey
1
"não impede que a JVM saia quando o programa termina, mas o encadeamento ainda está em execução" enquanto @sateesh diz que "a JVM interrompe todos os encadeamentos restantes do daemon que são abandonados". Então, os encadeamentos daemon terminam a execução quando a JVM sai?
Gerald
23
@Gerald, TODOS os threads são eliminados quando a JVM sai. B_erb disse: "... quando o programa terminar." O que isso significa é que, se o programa não matar explicitamente a JVM, a JVM se matará automaticamente quando o último encadeamento não- daemon terminar. Threads normais definem "quando o programa sai". Threads daemon não.
Solomon Slow
2
Portanto, essa linha thread that does not prevent the JVM from exiting when the program finishes but the thread is still runningbasicamente 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.
Bhargav
1
@SolomonSlow Quais são as consequências de matar um encadeamento de daemon (por exemplo, um coletor de lixo) enquanto ele ainda está fazendo seu trabalho, quando a JVM termina? Obrigado.
Venkat Ramakrishnan
340

Mais alguns pontos (Referência: Concorrência Java na Prática )

  • Quando um novo encadeamento é criado, ele herda o status do daemon de seu pai.
  • 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 :

    • finalmente os blocos não são executados ,
    • as pilhas não são desenroladas - a JVM acaba de sair.

    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.

Sateesh
fonte
3
Por que os daemon threads não devem ser usados ​​para E / S? É uma preocupação sobre BufferedWriters etc não ser liberado?
Paul Cager
4
@PaulCager Sim, eles podem ser cortados nos joelhos no meio de uma gravação / leitura também.
Cruncher
52
O segundo ponto é um disparate. Quando a JVM é interrompida, todos os encadeamentos morrem e nenhum finallybloco é executado, independentemente de os encadeamentos serem daemon ou não. Portanto, não ligue System.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.
Holger
11
O que se entende por "pilhas não são desenroladas"?
ɢʜʘʂʈ ʀɛɔʘɴ
2
@ ɢʜʘʂʈʀɛɔʘɴ há algumas explicações lá fora em "pilhas desenrolando", incluindo este: flylib.com/books/en/2.254.1.277/1
user766353
175

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.

public class DaemonTest {

    public static void main(String[] args) {
        new WorkerThread().start();

        try {
            Thread.sleep(7500);
        } catch (InterruptedException e) {
            // handle here exception
        }

        System.out.println("Main Thread ending") ;
    }

}

class WorkerThread extends Thread {

    public WorkerThread() {
        // When false, (i.e. when it's a user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the Worker thread terminates when the main 
        // thread terminates.
        setDaemon(true); 
    }

    public void run() {
        int count = 0;

        while (true) {
            System.out.println("Hello from Worker "+count++);

            try {
                sleep(5000);
            } catch (InterruptedException e) {
                // handle exception here
            }
        }
    }
}
russ
fonte
2
@russ Bom trecho de código! Eu tive que definir a classe WorkerThread como estática.
Xl # 31/13 /
@xli você poderia ter feito nova DaemonTest () new WorkerThread () start () também :)..
abhy
@russ bom exemplo. Eu estava ciente de que o padrão é "setDeamon (false)" se você não explicitamente definir "setDaemon (true)"
huseyin
96

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 em Thread.

Leia os tópicos do Daemon .

cleto
fonte
3
seu link está morto neste momento, talvez você queira atualizar? de qualquer forma, +1 para você.
Jasonw 06/07/12
2
Eu gosto da comparação entre UNIX e Windows.
Premraj
Melhor explicação aqui!
LoveMeow 28/08
57

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:

public class DaemonThread extends Thread {
    public void run() {
        System.out.println("Entering run method");

        try {
            System.out.println("In run Method: currentThread() is" + Thread.currentThread());

            while (true) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException x) {}

                System.out.println("In run method: woke up again");
            }
        } finally {
            System.out.println("Leaving run Method");
        }
    }
    public static void main(String[] args) {
        System.out.println("Entering main Method");

        DaemonThread t = new DaemonThread();
        t.setDaemon(true);
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException x) {}

        System.out.println("Leaving main method");
    }

}

Resultado:

C:\java\thread>javac DaemonThread.java

C:\java\thread>java DaemonThread
Entering main Method
Entering run method
In run Method: currentThread() isThread[Thread-0,5,main]
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
Leaving main method

C:\j2se6\thread>
Okky
fonte
37

Definição de Daemon (Computação):

Um processo em segundo plano que lida com solicitações de serviços, como spool de impressão e transferência de arquivos, e fica inativo quando não é necessário.

—— Fonte: Inglês por Oxford Dictionaries

O que é o thread do Daemon em Java?

  • Os encadeamentos do Daemon podem desligar a qualquer momento entre seu fluxo; o Não-Daemon, ou seja, o encadeamento do usuário é executado completamente.
  • Os encadeamentos daemon são encadeamentos executados intermitentemente em segundo plano, enquanto outros encadeamentos não daemon estiverem em execução.
  • Quando todos os encadeamentos não daemon são concluídos, os encadeamentos do daemon terminam automaticamente.
  • Os encadeamentos daemon são prestadores de serviços para encadeamentos de usuários em execução no mesmo processo.
  • A JVM não se preocupa com os encadeamentos do daemon para serem concluídos quando no estado Running, nem mesmo finalmente o bloco também permite executar. A JVM dá preferência aos encadeamentos não daemon criados por nós.
  • Threads daemon atuam como serviços no Windows.
  • A JVM para os encadeamentos do daemon quando todos os encadeamentos do usuário (em contraste com os encadeamentos do daemon) são finalizados. Portanto, os encadeamentos daemon podem ser utilizados para implementar, por exemplo, uma funcionalidade de monitoramento, pois o encadeamento é parado pela JVM assim que todos os encadeamentos do usuário são interrompidos.
Premraj
fonte
se você chamar System.exit (), nenhum bloco finalmente será executado, independentemente do segmento ser um daemon. de fato, finalmente blocos são executados em threads daemon, mesmo após as termina rosca última usuário se o JVM não matou o segmento ainda
Benez
5
Um encadeamento daemon é executado com a mesma prioridade que seu encadeamento de criação, a menos que tenha sido alterado antes do início. Os encadeamentos daemon não são necessariamente 'provedores de serviços' ou serviços do Windows ou qualquer outra coisa declarada aqui: são apenas encadeamentos que não impedem a saída da JVM. Período.
Marquês de Lorne #
35

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 o setDaemonmétodo, eles geralmente não saem, nem são interrompidos. Eles apenas param quando o aplicativo para.

Jack
fonte
1
É porque é um segmento de daemon, e esse é o significado de 'daemon'. Seu raciocínio está de volta à frente.
Marquês de Lorne
15

Gostaria de esclarecer um equívoco:

  • Suponha que se o encadeamento daemon (digamos B) for criado no encadeamento do usuário (digamos A); o final desse encadeamento do usuário / encadeamento pai (A) não encerrará o encadeamento daemon / encadeamento filho (B) que ele criou; o encadeamento do usuário fornecido é o único em execução no momento.
  • Portanto, não há relacionamento pai-filho no final do encadeamento. Todos os encadeamentos do daemon (independentemente de onde ele foi criado) terminarão quando não houver um encadeamento de usuário ativo único e isso fará com que a JVM seja encerrada.
  • Mesmo isso é verdade para ambos (pai / filho) são threads de daemon.
  • Se um encadeamento filho criado a partir de um encadeamento daemon, também é um encadeamento daemon. Isso não precisará de nenhuma configuração explícita de sinalizador de encadeamento daemon. Da mesma forma, se um encadeamento filho criado a partir de um encadeamento do usuário, também é um encadeamento do usuário, se você deseja alterá-lo, a configuração explícita do sinalizador de daemon é necessária antes do início desse encadeamento filho.
Kanagavelu Sugumar
fonte
Isso não é citado de nada. Não use formatação de citação para texto que não está entre aspas. O primeiro parágrafo da 'cotação' está incorreto e contradiz o segundo.
Marquês de Lorne
@EJP ENTENDEU, então cada um tem que citar outras pessoas aqui, não as suas. OU nós mesmos temos citação em algum lugar, em seguida, apontar aqui?
Kanagavelu Sugumar
Sim, se você citar alguém, você deve citá-lo, como em qualquer outro lugar, se você não citou alguém, não o formate como se fosse. Não consigo entender a sua segunda frase.
Marquês de Lorne,
12

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.

soubhagini
fonte
10

Java possui um tipo especial de encadeamento chamado daemon thread.

  • Prioridade muito baixa.
  • Só é executado quando nenhum outro thread do mesmo programa está em execução.
  • A JVM encerra o programa finalizando esses encadeamentos, quando os encadeamentos daemon são os únicos encadeamentos em execução em um programa.

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...

  • Você chama o setDaemon()método apenas antes de chamá-lo start(). Depois que o encadeamento estiver em execução, você não poderá modificar o status do daemon.
  • Use o isDaemon()método para verificar se um thread é um daemon ou um usuário.
zxholy
fonte
8
-1, não acredito que um encadeamento daemon seja inerentemente de baixa prioridade. Certamente nenhuma documentação que eu vi afirma isso. Além disso, este SO reivindicações de resposta que prioridade e daemon-Ness são ortogonais: stackoverflow.com/a/10298353/839128
MikeFHay
5
Threads daemon não têm nada a ver com prioridade. Você pode ter um encadeamento daemon de alta prioridade ou um encadeamento não daemon de baixa prioridade.
Grey
Um encadeamento daemon inicialmente tem a mesma prioridade que seu encadeamento de criação.
Marquês de Lorne #
A instrução "'Só é executada quando nenhum outro thread do mesmo programa está sendo executado" é enganosa.
Fredrick Gauss
9

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.

Harjit Singh
fonte
5

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.

Chanikag
fonte
5

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:

  1. 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).

  2. 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.

Aniket Thakur
fonte
5

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.

Java Guru
fonte
Quais são os outros tipos de encadeamento que fazem isso? A: Nenhum. Existem threads daemon e threads não daemon, ponto final. É um binário, dois estados.
Marquês de Lorne #
5

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.

public class DeamonTreadExample {

public static void main(String[] args) throws InterruptedException {

    Thread t = new Thread(() -> {
        int count = 0;
        while (true) {
            count++;
            try {
                System.out.println("inside try"+ count);
                Thread.currentThread().sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                System.out.println("finally executed"+ count);
            }
        }
    });
    t.setDaemon(true);
    t.start();

    Thread.currentThread().sleep(10000);
    System.out.println("main thread exited");
  }
}

Resultado

inside try1
finally executed1
inside try2
finally executed2
inside try3
finally executed3
inside try4
finally executed4
inside try5
finally executed5
inside try6
finally executed6
inside try7
finally executed7
inside try8
finally executed8
inside try9
finally executed9
inside try10
main thread exited
Bharat Sharma
fonte
4

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

Manish Malhotra
fonte
Aqui está um programa simples mostrando o daemon thread em java. journaldev.com/1072/java-daemon-thread-example
Pankaj
4

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.

user2663609
fonte
Muito confuso, e todos os 'so's' são não sequiturs.
Marquês de Lorne #
3

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.

public class DeamonThreadTest {

public static void main(String[] args) {

    new WorkerThread(false).start();    //set it to true and false and run twice.

    try {
        Thread.sleep(7500);
    } catch (InterruptedException e) {
        // handle here exception
    }

    System.out.println("Main Thread ending");
    }
   }

   class WorkerThread extends Thread {

    boolean isDeamon;

    public WorkerThread(boolean isDeamon) {
        // When false, (i.e. when it's a user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the Worker thread terminates when the main
        // thread terminates.
        this.isDeamon = isDeamon;
        setDaemon(isDeamon);
    }

    public void run() {
        System.out.println("I am a " + (isDeamon ? "Deamon Thread" : "User Thread (none-deamon)"));

        int counter = 0;

        while (counter < 10) {
            counter++;
            System.out.println("\tworking from Worker thread " + counter++);

            try {
                sleep(5000);
            } catch (InterruptedException e) {
                // handle exception here
            }
        }
        System.out.println("\tWorker thread ends. ");
    }
}



result when setDeamon(true)
=====================================
I am a Deamon Thread
    working from Worker thread 0
    working from Worker thread 1
Main Thread ending

Process finished with exit code 0


result when setDeamon(false)
=====================================
I am a User Thread (none-deamon)
    working from Worker thread 0
    working from Worker thread 1
Main Thread ending
    working from Worker thread 2
    working from Worker thread 3
    working from Worker thread 4
    working from Worker thread 5
    working from Worker thread 6
    working from Worker thread 7
    working from Worker thread 8
    working from Worker thread 9
    Worker thread ends. 

Process finished with exit code 0
Tony
fonte
3

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:

setDaemon(true)
Pankti
fonte
3
Eles não são 'geralmente conhecidos como threads de "provedor de serviços"'.
Marquês de Lorne
1
E eles podem ser usados ​​para executar qualquer código. A JVM não pode 'matá-los a qualquer momento', mas os matará quando não houver encadeamentos que não sejam daemon em execução.
Marquês de Lorne #
@EJP talvez eu esteja errado, mas "isso os matará" quando threads não daemon estiverem em execução. Quando um encadeamento é daemon, ele não está sendo executado separadamente, mantendo a jvm até que seja executado completamente e agora seja gerenciado no nível do SO.
89n3ur0n 27/06
Isso irá matá-los quando todos os threads que não sejam daemon tiverem saído, e não um picossegundo antes. Certamente não "a qualquer momento".
Marquês de Lorne #
3

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 iniciado

Para obter mais referência: Thread daemon em Java

Sai Sunder
fonte
2

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 .

Gregory Nozik
fonte
2

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.

Arman Tumanyan
fonte
como pode ser assim que o encadeamento do GC funciona? A coleta de lixo não é executada mesmo que o encadeamento principal do programa demore muito tempo (o encadeamento principal não termina)?
Calicoder #
Como eu mencionei, o encadeamento do GC funcionará até o final do último encadeamento de daemon NON. O thread principal do programa não é daemon, como sabemos, portanto, o thread do GC realizará o trabalho assim que o thread principal for concluído / eliminado. Basicamente, quero dizer que os threads daemon serão encerrados quando o processo estiver concluído e o processo concluído quando todos os threads não daemon forem executados.
Arman Tumanyan
Por padrão, o status do daemon de um encadeamento é herdado de seu pai.
Marquês de Lorne #
-1

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.

if ( threadShouldDieOnApplicationEnd ) {
    thread.setDaemon ( true );
}
thread.start();
Hans Wurst
fonte
Isto está errado. Não se trata de tópicos de criadores. Se houver QUALQUER thread de não usuário em execução, os threads do daemon continuarão em execução. Isso pode ser facilmente testado criando um encadeamento em primeiro plano que gera um encadeamento daemon. Mesmo após a joinedição do encadeamento em primeiro plano , o daemon permanecerá enquanto o encadeamento principal for executado.
Hubert Grzeskowiak 27/09/19
Os encadeamentos do daemon morrem quando a JVM não possui mais encadeamentos não daemon executáveis. Veja o Javadoc. A resposta está completamente incorreta.
Marquês de Lorne #