Co to jest wątek demona w Javie?


809

Czy ktoś może mi powiedzieć, jakie wątki demonów są w Javie ?


20
ThreadJavadoc opisuje, czym one są: java.sun.com/javase/6/docs/api/java/lang/Thread.html
skaffman


2
W przypadku wątków demonów, gdy JVM zatrzymuje się, wszystkie wątki demonów są opuszczane Z tego powodu wątki demonów nie powinny być często używane, ponieważ może nie zostać na nich wykonane czyszczenie. Na przykład żadne operacje wejścia / wyjścia nie byłyby wdzięcznie zamykane i zapisywane / odczytywane do samego końca.
msj121

Odpowiedzi:


631

Wątek demona jest wątkiem, który nie uniemożliwia wyjścia maszyny JVM po zakończeniu programu, ale wątek nadal działa. Przykładem wątku demona jest odśmiecanie.

Możesz użyć tej setDaemon(boolean)metody, aby zmienić Threadwłaściwości demona przed uruchomieniem wątku.


210
W przypadku potomności setDamon(boolean)można go wywołać tylko przed rozpoczęciem wątku. Domyślnie wątek dziedziczy status demona jego wątku nadrzędnego.
Gray

1
„nie zapobiega wyjściu JVM po zakończeniu programu, ale wątek nadal działa”, podczas gdy @sateesh mówi, że „JVM zatrzymuje wszelkie pozostałe wątki demona są porzucane”. Czy wątki demonów kończą się, gdy JVM kończy pracę?
Gerald

23
@ Gerald, WSZYSTKIE wątki są zabijane po wyjściu JVM. B_erb powiedział: „... kiedy program się zakończy”. Oznacza to, że jeśli program nie zabije jawnie JVM, wówczas JVM automatycznie zabije się, gdy skończy się ostatni wątek inny niż demon. Normalne wątki definiują „kiedy program się kończy”. Wątki demonów nie.
Solomon Slow

2
Ta linia thread that does not prevent the JVM from exiting when the program finishes but the thread is still runningoznacza w zasadzie, że proces JVM, który uruchomił wątek, nie dba o to, czy wątek demona zakończy działanie, czy nie, po prostu zakończy się, jeśli wszystkie normalne wątki zakończą wykonywanie.
Bhargav

1
@SolomonSlow Jakie są konsekwencje zabicia wątku demona (na przykład modułu wyrzucania elementów bezużytecznych), gdy nadal wykonuje swoją pracę, gdy kończy się JVM? Dzięki.
Venkat Ramakrishnan

340

Jeszcze kilka punktów (odniesienie: Java Concurrency in Practice )

  • Po utworzeniu nowego wątku dziedziczy status demona jego elementu nadrzędnego.
  • Gdy wszystkie wątki niebędące demonami zakończą się, maszyna JVM zatrzymuje się, a wszelkie pozostałe wątki demonów są porzucane :

    • wreszcie bloki nie są wykonywane ,
    • stosy nie są rozwijane - JVM właśnie wychodzi.

    Z tego powodu wątki demonów powinny być używane oszczędnie, a ich używanie do zadań, które mogą wykonywać dowolne operacje wejścia / wyjścia, jest niebezpieczne.


3
Dlaczego wątki demona nie powinny być używane do operacji we / wy? Czy chodzi o to, że BufferedWriters itp. Nie zostanie opróżnione?
Paul Cager

4
@PaulCager Tak, mogą po prostu zostać odcięci na kolanach w trakcie pisania / czytania.
Cruncher

52
Drugi punkt to nonsens. Gdy JVM zatrzymuje się, wszystkie wątki giną i nie finallysą wykonywane żadne bloki, niezależnie od tego, czy wątki są demonami, czy nie. Nie dzwoń, System.exit(…)jeśli uważasz, że mogą istnieć uruchomione wątki wykonujące operacje we / wy. Jedyna różnica polega na tym, że JVM wyzwoli własne zakończenie, gdy zostaną tylko wątki demona.
Holger

11
Co należy rozumieć przez „stosy nie są rozwijane”?
ɢʜʘʂʈ ʀɛɔʘɴ

2
@ ɢʜʘʂʈʀɛɔʘɴ istnieje kilka wyjaśnień na temat „rozwijania stosów”, w tym: flylib.com/books/en/2.254.1.277/1
user766353

175

Wszystkie powyższe odpowiedzi są dobre. Oto prosty krótki fragment kodu, który ilustruje różnicę. Wypróbuj z każdą wartością true i false w 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
            }
        }
    }
}

2
@russ Dobry fragment kodu! Musiałem jednak zdefiniować klasę WorkerThread jako statyczną.
xli

@xli mogłeś zrobić nowy DaemonTest (). nowy WorkerThread (). start () też :)
abhy

@russ dobry przykład. Wiedziałem, że domyślnym jest „setDeamon (false)”, jeśli nie zdefiniujesz wyraźnie „setDaemon (true)”
huseyin

96

Tradycyjnie procesami demonów w systemie UNIX były procesy działające w tle, podobnie jak usługi w systemie Windows.

Wątek demona w Javie to taki, który nie uniemożliwia wyjścia JVM. W szczególności JVM zakończy działanie, gdy pozostaną tylko wątki demona. Tworzysz go, wywołując setDaemon()metodę Thread.

Przeczytaj wątki Daemon .


3
Twój link nie działa w tym momencie, może chcesz zaktualizować? w każdym razie +1 dla ciebie.
Jasonw,

2
Podoba mi się porównanie między UNIX a Windows.
Premraj

Najlepsze wyjaśnienie tutaj!
LoveMeow

57

Wątki demona są jak dostawcy usług dla innych wątków lub obiektów działających w tym samym procesie co wątek demona. Wątki demona są używane do zadań wspierających w tle i są potrzebne tylko podczas wykonywania normalnych wątków. Jeśli normalne wątki nie są uruchomione, a pozostałe wątki są wątkami demonicznymi, interpreter kończy działanie.

Na przykład przeglądarka HotJava używa do czterech wątków demona o nazwie „Moduł pobierania obrazu” do pobierania obrazów z systemu plików lub sieci dla dowolnego wątku, który tego potrzebuje.

Wątki demona są zwykle używane do wykonywania usług dla aplikacji / apletu (takich jak ładowanie „bitów fiddley”). Zasadnicza różnica między wątkami użytkownika a wątkami demona polega na tym, że JVM zamknie program dopiero po zakończeniu wszystkich wątków użytkownika. Wątki demonów są kończone przez JVM, gdy nie są już uruchomione żadne wątki użytkownika, w tym główny wątek wykonania.

setDaemon (prawda / fałsz)? Ta metoda służy do określenia, że ​​wątek jest wątkiem demona.

public boolean isDaemon ()? Ta metoda służy do ustalenia, czy wątek jest wątkiem demona, czy nie.

Na przykład:

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");
    }

}

Wynik:

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>

37

Definicja demona (Computing):

Proces w tle, który obsługuje żądania usług, takich jak buforowanie wydruku i przesyłanie plików, i jest nieaktywny, gdy nie jest wymagany.

—— Źródło: angielski przez Oxford Dictionaries

Co to jest wątek Daemon w Javie?

  • Wątki demona mogą zostać zamknięte w dowolnym momencie pomiędzy ich przepływem, Non-Daemon, tzn. Wątek użytkownika wykonuje się całkowicie.
  • Wątki demonów to wątki działające sporadycznie w tle, o ile działają inne wątki niebędące demonami.
  • Po zakończeniu wszystkich wątków innych niż demony wątki demonów kończą się automatycznie.
  • Wątki demona są dostawcami usług dla wątków użytkowników działających w tym samym procesie.
  • JVM nie dba o to, aby wątki demona zostały ukończone w stanie Uruchomionym, nawet w końcu blok nie pozwala na wykonanie. JVM preferuje wątki inne niż demon, które są tworzone przez nas.
  • Wątki demona działają jako usługi w systemie Windows.
  • JVM zatrzymuje wątki demona, gdy wszystkie wątki użytkownika (w przeciwieństwie do wątków demona) są zakończone. W związku z tym wątki demona można wykorzystać do implementacji, na przykład, funkcji monitorowania, gdy JVM zatrzymuje wątek, gdy tylko wszystkie wątki użytkownika zostaną zatrzymane.

jeśli wywołasz System.exit (), ostatecznie nie są wykonywane bloki, niezależnie od tego, że wątek jest wątkiem demona. w końcu bloki są wykonywane w wątkach demona, nawet po zakończeniu ostatniego wątku użytkownika, jeśli JVM jeszcze go nie zabił
benez

5
Wątek demona działa z tym samym priorytetem, co wątek tworzący, chyba że został zmieniony przed uruchomieniem. Wątki demona niekoniecznie są „usługodawcami”, usługami Windows lub czymkolwiek innym tutaj podanym: są to tylko wątki, które nie uniemożliwiają wyjścia JVM. Kropka.
user207421,

35

Wątek demon jest wątek, który jest uważany robi pewne zadania w tle jak rozpatrywania wniosków lub różnych chronjobs które mogą występować w aplikacji.

Gdy w twoim programie pozostaną tylko wątki demona , zakończy działanie. Jest tak, ponieważ zwykle te wątki współpracują z normalnymi wątkami i zapewniają obsługę zdarzeń w tle.

Możesz określić, że a Threadjest demonem za pomocą setDaemonmetody, zwykle nie wychodzą, ani nie są przerywane. Po prostu zatrzymują się, gdy aplikacja się zatrzyma.


1
To dlatego, że jest to wątek demona, i to właśnie oznacza „demon”. Twoje rozumowanie jest z powrotem na pierwszy plan.
user207421,

15

Jedno nieporozumienie, które chciałbym wyjaśnić:

  • Załóżmy, że jeśli wątek demona (powiedzmy B) jest tworzony w wątku użytkownika (powiedzmy A); zakończenie tego wątku użytkownika / wątku nadrzędnego (A) nie zakończy wątku demona / wątku potomnego (B), który utworzył; pod warunkiem, że wątek użytkownika jest jedynym aktualnie uruchomionym.
  • Więc nie ma relacji rodzic-dziecko na zakończeniu wątku. Wszystkie wątki demona (niezależnie od tego, gdzie są tworzone) zakończą się, gdy nie będzie pojedynczego wątku aktywnego użytkownika, co spowoduje zakończenie pracy JVM.
  • Nawet to jest prawdą dla obu (rodzica / dziecka) są wątkami demona.
  • Jeśli wątek potomny utworzony z wątku demona, jest to również wątek demona. Nie będzie to wymagało żadnego jawnego ustawienia flagi wątku demona. Podobnie, jeśli wątek potomny utworzony z wątku użytkownika, jest to również wątek użytkownika, jeśli chcesz go zmienić, konieczne jest jawne ustawienie flagi demona przed rozpoczęciem tego wątku.

To nie jest cytowane z niczego. Nie używaj formatowania cytatów dla tekstu, który nie jest cytowany. Pierwszy akapit „cytatu” jest niepoprawny i jest sprzeczny z drugim akapitem.
user207421,

@ EJP GOT IT, więc każdy musi tutaj cytować innych ludzi, a nie swoje. LUB sami gdzieś cytat, a następnie wskaż tutaj?
Kanagavelu Sugumar

Tak, jeśli cytujesz kogoś, musisz go zacytować, tak jak gdzie indziej, bit, jeśli nikogo nie zacytowałeś, nie formatuj go tak, jakbyś to zrobił. Nie mogę zrobić głowy ani ogona z drugiego zdania.
user207421,

12

Wątek demona i wątki użytkownika. Zasadniczo wszystkie wątki utworzone przez programistę są wątkiem użytkownika (chyba że podasz go jako demon lub twój wątek nadrzędny jest demonem). Wątek użytkownika jest zasadniczo przeznaczony do uruchamiania naszego kodu programu. JVM nie kończy się, dopóki nie zakończy się cały wątek użytkownika.


10

Java ma specjalny rodzaj wątku zwany demonem wątku.

  • Bardzo niski priorytet.
  • Wykonuje się tylko, gdy nie działa żaden inny wątek tego samego programu.
  • JVM kończy program kończąc te wątki, gdy wątki demona są jedynymi wątkami działającymi w programie.

Do czego służą wątki demonów?

Zwykle używany jako usługodawca dla normalnych wątków. Zwykle mają nieskończoną pętlę, która czeka na zgłoszenie serwisowe lub wykonuje zadania wątku. Nie mogą wykonywać ważnych prac. (Ponieważ nie wiemy, kiedy będą mieli czas procesora i mogą zakończyć w dowolnym momencie, jeśli nie są uruchomione żadne inne wątki).

Typowym przykładem tego rodzaju wątków jest moduł śmieciowy Java .

Jest więcej...

  • Wywołujesz setDaemon()metodę dopiero przed wywołaniem start()metody. Po uruchomieniu wątku nie można modyfikować jego statusu demona.
  • Użyj isDaemon()metody, aby sprawdzić, czy wątek jest wątkiem demona czy wątkiem użytkownika.

8
-1, nie wierzę, że wątek demona ma z natury niski priorytet. Z pewnością nie widziałem takiej dokumentacji. Również ta odpowiedź SO twierdzi, że priorytet i demon są ortogonalne: stackoverflow.com/a/10298353/839128
MikeFHay

5
Wątki demonów nie mają nic wspólnego z priorytetem. Możesz mieć wątek demona o wysokim priorytecie lub wątek demona o niskim priorytecie.
Gray

Wątek demona ma początkowo taki sam priorytet jak wątek tworzący.
user207421,

Stwierdzenie „Wykonuje się tylko wtedy, gdy nie działa żaden inny wątek tego samego programu” jest mylące.
Fredrick Gauss,

9

Wątki demonów są jak asystenci. Wątki inne niż demony są jak czołowi wykonawcy. Asystenci pomagają wykonawcom w ukończeniu pracy. Po zakończeniu zadania wykonawcy nie potrzebują już pomocy do wykonania. Ponieważ pomoc nie jest potrzebna, asystenci opuszczają to miejsce. Kiedy zadania wątków innych niż demon zostaną zakończone, wątki demona znikają.


5

Wątek demona jest jak normalny wątek, z tą różnicą, że JVM zostanie zamknięty tylko wtedy, gdy inne wątki inne niż demon nie istnieją. Wątki demonów są zwykle używane do świadczenia usług dla aplikacji.


5

Wątek demona w Javie to wątek działający w tle i najczęściej tworzony przez JVM do wykonywania zadań w tle, takich jak odśmiecanie i inne zadania związane z utrzymaniem domu.

Punkty do odnotowania:

  1. Każdy wątek utworzony przez główny wątek, który uruchamia główną metodę w Javie, domyślnie nie jest demonem, ponieważ Thread dziedziczy naturę demona od wątku, który go tworzy, tj. Wątku macierzystego, a ponieważ wątek główny jest wątkiem innym niż demon, każdy inny wątek utworzony z niego będzie pozostają nie-demonami, dopóki jawnie nie stanie się demonem, wywołując setDaemon (true).

  2. Thread.setDaemon (true) tworzy demona wątku, ale można go wywołać tylko przed uruchomieniem wątku w Javie. Zgłasza IllegalThreadStateException, jeśli odpowiedni wątek jest już uruchomiony i uruchomiony.

Różnica między wątkiem Daemon i Non Daemon w Javie:

1) JVM nie czeka na zakończenie żadnego wątku demona.

2) Wątek demona jest traktowany inaczej niż wątek użytkownika, gdy JVM kończy działanie, w końcu bloki nie są wywoływane, stosy nie są rozwijane, a JVM po prostu wychodzi.


5

W Javie wątki demona są jednym z typów wątku, który nie uniemożliwia wyjścia wirtualnej maszyny Java (JVM). Głównym celem wątku demona jest wykonanie zadania w tle, szczególnie w przypadku rutynowych zadań okresowych lub pracy. Po wyjściu z JVM umiera również wątek demona.

Ustawienie a powoduje thread.setDaemon(true), że wątek staje się wątkiem demona. Można jednak ustawić tę wartość tylko przed rozpoczęciem wątku.


Jakie są inne rodzaje wątków, które to robią? Odp .: Brak. Istnieją wątki demoniczne i wątki inne niż demon, kropka. Jest to plik binarny, Dwa stany.
user207421,

5

Oto przykład, aby przetestować zachowanie wątków demona w przypadku wyjścia jvm z powodu braku wątków użytkownika.

Zwróć uwagę na ostatni ostatni wiersz w wynikach poniżej, gdy główny wątek zakończył działanie, wątek demona również umarł i nie wypisał instrukcji wykonanej ostatecznie9 w bloku ostatecznie. Oznacza to, że wszelkie zasoby we / wy zamknięte w końcu bloku wątku demona nie zostaną zamknięte, jeśli JVM zakończy działanie z powodu nieistnienia wątków użytkownika.

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");
  }
}

Wynik

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

4

Wątki demonów są, jak wszyscy wyjaśnili, nie ograniczają JVM do wyjścia, więc w zasadzie jest to szczęśliwy wątek dla aplikacji z punktu widzenia wyjścia.

Chcę dodać, że wątków demona można użyć, gdy powiedzę, że udostępniam interfejs API, np. Wypychając dane na serwer zewnętrzny lub JMS, może być konieczne agregowanie danych na poziomie JVM klienta, a następnie wysyłanie do JMS osobnego wątku. Mogę utworzyć ten wątek jako wątek demona, jeśli nie są to dane obowiązkowe, które należy przekazać na serwer. Tego rodzaju dane są jak push log / agregacja.

Pozdrawiam, Manish


Oto prosty program pokazujący wątek demona w java. journaldev.com/1072/java-daemon-thread-example
Pankaj

4

Wątek demona jest jak proces demona, który jest odpowiedzialny za zarządzanie zasobami, wątek demona jest tworzony przez maszynę wirtualną Java w celu obsługi wątków użytkownika. przykładowy system aktualizacji dla unixa, unix to proces demona. potomek wątku demona jest zawsze wątkiem demona, więc domyślnie demon ma wartość false. możesz sprawdzić wątek jako demona lub użytkownika za pomocą metody „isDaemon ()”. więc wątek lub proces demona są w zasadzie odpowiedzialne za zarządzanie zasobami. na przykład podczas uruchamiania jvm uruchomiony jest moduł czyszczenia pamięci, który jest wątkiem demona, którego priorytetem jest 1, który jest najniższy, który zarządza pamięcią. jvm żyje tak długo, jak wątek użytkownika jest aktywny, nie możesz zabić demona thread.jvm jest odpowiedzialny za zabicie wątków demona.


Bardzo zdezorientowany, a wszystkie „tak” nie
user207421,

3

Porozmawiajmy tylko w kodzie z działającymi przykładami. Podoba mi się powyższa odpowiedź Russa, ale aby usunąć wszelkie wątpliwości, trochę ją ulepszyłem. Uruchomiłem go dwa razy, raz z wątkiem roboczym ustawionym na deamon true (wątek deamon), a innym razem na false (wątek użytkownika). Potwierdza, że ​​nić diamon kończy się, gdy kończy się nić główna.

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

3

Wątki demonów są ogólnie znane jako wątki „usługodawcy”. Wątków tych nie należy używać do wykonywania kodu programu, ale kodu systemowego. Wątki te działają równolegle do kodu, ale JVM może je zabić w dowolnym momencie. Gdy JVM nie znajdzie wątków użytkownika, zatrzymuje je, a wszystkie wątki demona kończą się natychmiast. Możemy ustawić wątek inny niż demon na demona, używając:

setDaemon(true)

3
Nie są one powszechnie znane jako wątki „dostawcy usług”.
user207421

1
I mogą być użyte do wykonania dowolnego kodu. JVM nie może „zabić je w każdej chwili”, ale będzie ich zabić, gdy nie ma żadnych wątków non-demon uruchomione.
user207421,

@EJP może się mylę, ale „zabije ich”, gdy działają wątki inne niż demony. Gdy wątek jest demonem, czy nie działa osobno, trzymając jvm, dopóki nie wykona się całkowicie i nie będzie zarządzany na poziomie systemu operacyjnego.
89n3ur0n

Zabije ich, gdy wszystkie wątki niebędące demonami wyjdą, a nie pikosekunda wcześniej. Na pewno nie „w każdej chwili”.
user207421,

3

Wątki demonów są wątkami działającymi w tle, dopóki inne wątki procesu inne niż demony są nadal uruchomione. Zatem po zakończeniu wszystkich wątków nie-demonów wątki demonów zostają zakończone. Przykładem wątku niebędącego demonem jest wątek uruchamiający Main. Wątek jest demonem poprzez wywołaniesetDaemon() metody przed uruchomieniem wątku

Więcej informacji: wątek Daemon w Javie


2

Dla mnie wątek demona jest jak opiekun domu dla wątków użytkowników. Jeśli wszystkie wątki użytkownika zakończą się, wątek demona nie ma zadania i zostaje zabity przez maszynę JVM. Wyjaśniłem to w filmie na YouTube .


2

JVM wykona pracę po zakończeniu ostatniego wykonania wątku nie-demona. Domyślnie JVM utworzy wątek jako nondaemon, ale możemy zrobić wątek jako demon za pomocą metody setDaemon(true). Dobrym przykładem wątku Daemon jest wątek GC, który zakończy swoją pracę, gdy tylko wszystkie wątki nondaemon zostaną zakończone.


jak to może być, jak działa wątek GC? Czy odśmiecanie nie działa, nawet jeśli główny wątek programu zajmuje bardzo dużo czasu (główny wątek się nie kończy)?
Calicoder,

Jak wspomniałem, wątek GC będzie działał do końca ostatniego wątku demona NON, który dokończy jego wykonanie. Główny wątek programu nie jest demonem, ponieważ wiemy, że wątek GC wykona pracę po zakończeniu / zabiciu głównego wątku. Zasadniczo chcę powiedzieć, że wątki demonów zostaną zakończone po zakończeniu procesu, a proces zostanie zakończony, gdy zostaną wykonane wszystkie wątki demonów.
Arman Tumanyan

Domyślnie status demona wątku jest dziedziczony od jego rodzica.
user207421,

-1

Wątki demonów umierają po wyjściu wątku twórcy.

Wątki inne niż demony (domyślne) mogą nawet żyć dłużej niż główny wątek.

if ( threadShouldDieOnApplicationEnd ) {
    thread.setDaemon ( true );
}
thread.start();

To jest źle. Tu nie chodzi o wątki twórców. Jeśli działa dowolny wątek inny niż użytkownik, wątki demona będą nadal działać. Można to łatwo przetestować, tworząc wątek pierwszego planu, który spawnuje wątek demona. Nawet po edycji wątku pierwszego planu joindemon pozostanie tak długo, jak działa wątek główny.
Hubert Grzeskowiak

Wątki demonów giną, gdy JVM przestaje działać jako wątki niebędące demonami. Zobacz Javadoc. Odpowiedź jest całkowicie niepoprawna.
user207421,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.