Що таке нитка демона на Java?


809

Хтось може сказати мені, що демонні нитки є на Java ?


20
ThreadJavadoc описує те , що вони: java.sun.com/javase/6/docs/api/java/lang/Thread.html
skaffman


2
Для Daemon Threads, коли JVM зупиняє всі потоки демона, з-за цієї причини нитки демона не слід використовувати часто, оскільки очищення може не виконуватись на них. Наприклад, будь-який ввід / вивід не буде витончено виходити і записувати / читати до кінця.
msj121

Відповіді:


631

Демонова нитка - це потік, який не перешкоджає виходу JVM після завершення програми, але потік все ще працює. Прикладом демонової нитки є збирання сміття.

Ви можете використовувати setDaemon(boolean)метод для зміни Threadвластивостей демона до початку потоку.


210
Для нащадків setDamon(boolean)можна зателефонувати лише до початку потоку. За замовчуванням потік успадковує статус демона його батьківського потоку.
Сірий

1
"не заважає JVM виходити, коли програма закінчується, але нитка все ще працює", а @sateesh каже, що "JVM зупиняє залишення будь-яких потоків демона". Так закінчуються демонні нитки, коли JVM виходить?
Джеральд

23
@Gerald, ВСІ потоки вбиваються при виході JVM. B_erb сказав: "... коли програма закінчується". Що це означає, якщо програма не відкрито вбити JVM, то JVM буде автоматично вбити себе , коли останні не є -daemon кінців ниток. Звичайні потоки визначають "коли програма закінчується". Нитки Демона ні.
Соломон повільно

2
Таким чином, цей рядок в thread that does not prevent the JVM from exiting when the program finishes but the thread is still runningосновному означає процес JVM, який розпочав потік, не важливо, чи завершено виконання потоку демона, чи ні, він просто закінчиться, якщо всі нормальні потоки закінчили виконання.
Бхаргав

1
@SolomonSlow Які наслідки вбиває демонова нитка (наприклад, сміттєзбірник), поки вона все ще виконує свою роботу, коли закінчується СВМ? Дякую.
Венкат Рамакришнан

340

Ще кілька пунктів (Довідка: Конкурс Java на практиці )

  • Коли створюється новий потік, він успадковує статус демона свого батька.
  • Коли всі недемонові потоки закінчуються, JVM зупиняється, а будь-які інші демонові нитки залишаються :

    • нарешті блоки не виконуються ,
    • стеки не розкручені - JVM просто виходить.

    З цієї причини нитки демона повинні використовуватися мало, і небезпечно використовувати їх для завдань, які можуть виконувати будь-які введення / виведення.


3
Чому не слід використовувати нитки демона для вводу / виводу? Чи стурбовано питання про те, що BufferedWriters тощо не змиє?
Пол Кагер

4
@PaulCager Так, вони можуть просто відрізатися на колінах посеред запису / читання.
Cruncher

52
Другий пункт - нісенітниця. Коли JVM зупиняється, всі нитки відмирають і жодні finallyблоки не виконуються, незалежно від того, чи є потоки демоновими чи ні. Тому не дзвоніть, System.exit(…)якщо ви думаєте, що можуть бути запущені потоки, які виконують введення-виведення. Єдина відмінність полягає в тому, що JVM спровокує власне припинення, коли залишиться лише демон-нитки.
Холгер

11
Що розуміється під "стеками не розмотуються"?
ɢʜʘʂʈ ʀɛɔʘɴ

2
@ ɢʜʘʂʈʀɛɔʘɴ є кілька пояснень щодо "розмотування стеків", включаючи це: flylib.com/books/en/2.254.1.277/1
користувач766353

175

Усі вищезазначені відповіді хороші. Ось простий маленький фрагмент коду для ілюстрації різниці. Спробуйте це з кожним зі значень true та false у 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 Хороший фрагмент коду! Мені довелося визначити клас WorkerThread як статичний.
xli

@xli ти міг зробити новий DaemonTest (). новий WorkerThread (). start () теж :)
abhy

@russ хороший приклад. Мені було відомо про те, що типовим є "setDeamon (false)", якщо ви чітко не визначаєте "setDaemon (true)"
huseyin

96

Традиційно демонові процеси в UNIX були тими, які постійно працювали у фоновому режимі, як і служби в Windows.

Демонова нитка в Java - це та, яка не заважає JVM виходити. Зокрема, JVM вийде, коли залишаться лише демонові нитки. Ви можете створити один з допомогою виклику setDaemon()методу на Thread.

Прочитайте теми Демона .


3
у цей момент ваше посилання мертве, можливо, ви хочете оновити? все одно, +1 для вас.
Джейсон

2
Мені подобається порівняння між UNIX та Windows.
Премрай,

Найкраще тут пояснення!
LoveMeow

57

Нитки Daemon - це як постачальники послуг для інших потоків або об'єктів, що працюють в тому ж процесі, що й потік демона. Нитки Daemon використовуються для фонових задач підтримки та потрібні лише під час виконання звичайних потоків. Якщо нормальні потоки не запущені, а інші потоки є демоновими нитками, то інтерпретатор виходить.

Наприклад, браузер HotJava використовує до чотирьох демонових потоків під назвою "Збір зображень" для отримання зображень з файлової системи або мережі для будь-якого потоку, який потрібен.

Нитки Daemon, як правило, використовуються для виконання служб для вашого додатка / аплету (наприклад, завантаження "скрипкових біт"). Основна відмінність між потоками користувачів та потоками демонів полягає в тому, що JVM буде закривати програму лише тоді, коли всі потоки користувачів закінчуються. Нитки Daemon закінчуються JVM, коли більше не працює жодних потоків користувачів, включаючи основний потік виконання.

setDaemon (правда / хибність)? Цей метод використовується для визначення того, що нитка є демоновою ниткою.

public boolean isDeemon ()? Цей метод використовується для визначення нитки, є демонова нитка чи ні.

Наприклад:

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

}

Вихід:

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

Визначення Daemon (Computing):

Фоновий процес, який обробляє запити на послуги, такі як котунка друку та передача файлів, і дрімає, коли цього не потрібно.

—— Джерело: англійською мовою Оксфордські словники

Що таке нитка Daemon в Java?

  • Нитки Daemon можуть вимикатися в будь-який час між їх потоком, Non-Daemon, тобто користувацька нитка, виконується повністю.
  • Нитки Демона - це нитки, які перериваються у фоновому режимі доти, доки запущені інші недемонові потоки.
  • Коли всі недемонові потоки завершені, потоки демонів автоматично припиняються.
  • Нитки Daemon - це постачальники послуг для потоків користувачів, що працюють в одному і тому ж процесі.
  • JVM не піклується про демонові потоки для завершення, коли в стані Running навіть не остаточно блокувати також дозволити виконання. JVM надають перевагу створеним нами недемонним потокам.
  • Нитки Daemon виступають як сервіси в Windows.
  • JVM зупиняє потоки демона, коли всі потоки користувачів (на відміну від потоків демона) закінчуються. Отже, демонові потоки можуть використовуватися для реалізації, наприклад, функціональності моніторингу, оскільки потік зупиняється JVM, як тільки всі потоки користувачів зупиняються.

якщо ви викликаєте System.exit (), остаточно не виконуються блоки, незалежно від того, що нитка є демоновою ниткою. насправді блоки виконуються в
демонових потоках

5
Демон-потік виконує той самий пріоритет, що і його створений потік, якщо він не був змінений до запуску. Нитки Daemon не обов'язково є "постачальниками послуг" або службами Windows або будь-яким іншим, що вказано тут: це лише теми, які не заважають JVM виходити. Період.
користувач207421

35

Демон потік є потоком , який вважається робити деякі завдання у фоновому режимі , таких як обробка запитів або різних chronjobs , які можуть існувати в додатку.

Коли у вашій програмі залишиться лише демонові нитки, вона вийде. Це тому, що зазвичай ці нитки працюють разом із звичайними нитками та забезпечують обробку подій фоном.

Ви можете вказати, що a Thread- це демон , використовуючи setDaemonметод, вони зазвичай не виходять, а також не перериваються .. вони просто зупиняються, коли додаток зупиняється.


1
Це тому, що це демонова нитка, і саме в цьому полягає значення "демон". Ваші міркування повертаються до переду.
користувач207421

15

Я хотів би уточнити одне помилкове уявлення:

  • Припустимо, що якщо демонова нитка (скажімо B) створена в потоці користувача (скажімо, A); тоді закінчення цього потоку користувача / батьківського потоку (A) не закінчиться створеним ним потоком демона / дочірнього потоку (B); за умови, що користувальницький потік є єдиним на даний момент.
  • Таким чином, немає жодних стосунків батько-дитина з закінченням потоку. Усі потоки демонів (незалежно від місця їх створення) закінчуються, коли не буде єдиного потокового потоку користувача, і це призводить до припинення JVM.
  • Навіть це справедливо для обох (батька / дитини) - демонові нитки.
  • Якщо дочірня нитка створена з демонової нитки, то це також демонова нитка. Тут не знадобиться явне налаштування прапора потоку демона. Аналогічно, якщо дочірній потік, створений з користувальницької нитки, то це також користувальницька нитка, якщо ви хочете змінити його, то перед запуском цього дочірнього потоку потрібні явні налаштування прапора демона.

Це ні з чого не цитується. Не використовуйте форматування цитат для тексту, який не цитується. Перший абзац "цитати" невірний та суперечить другому.
користувач207421

@EJP ОСТОРОЖИЙ, Отже, кожен повинен давати тут іншим котирування, а не свої. АБО ми самі цитуємо десь тоді вкажіть тут?
Канагавелу Сугумар

Так, якщо ви цитуєте когось, ви мусите їх цитувати, як і деінде, біт, якщо ви нікого не цитували, не форматуйте його так, як у вас є. Я не можу скласти голову чи хвіст другого речення.
користувач207421

12

Daemon Thread та User Threads. Як правило, всі потоки, створені програмістом, є потоком користувача (якщо ви не вказали, що це демон, або ваш батьківський потік є потоком демона). Користувацький потік, як правило, призначений для запуску нашого програмного коду. JVM не припиняється, якщо не припиняється весь потік користувача.


10

У Java є особливий вид потоку під назвою демонова нитка.

  • Дуже низький пріоритет.
  • Виконується лише тоді, коли не працює жоден інший потік тієї ж програми.
  • JVM закінчує програму, закінчуючи ці потоки, коли демонні потоки є єдиними потоками, що виконуються в програмі.

Для чого використовуються демонові нитки?

Зазвичай використовується як постачальник послуг для звичайних потоків. Зазвичай мають нескінченний цикл, який чекає сервісного запиту або виконує завдання потоку. Вони не можуть робити важливих робіт. (Тому що ми не знаємо, коли у них буде час процесора, і вони можуть закінчити будь-який час, якщо немає інших потоків.)

Типовим прикладом такого роду ниток є сміттєзбірник Java .

Є ще ...

  • Ви викликаєте setDaemon()метод лише до того, як викликаєте start()метод. Після запуску потоку ви не можете змінити його статус демона.
  • Використовуйте isDaemon()метод, щоб перевірити, чи є потоком демона або потоком користувача.

8
-1, я не вірю, що демонова нитка по своїй суті є низькою пріоритетністю. Звичайно, жодна документація не бачила такого. Крім того, це SO претензії відповідь , що пріоритет і демон-Несс ортогональні: stackoverflow.com/a/10298353/839128
MikeFHay

5
Нитки Демона не мають нічого спільного з пріоритетом. Ви можете мати демонову нитку з високим пріоритетом або недемонну нитку з низьким пріоритетом.
Сірий

Демонова нитка спочатку має той же пріоритет, що і її створена нитка.
користувач207421

Заява "" Виконується лише тоді, коли не працює інший потік цієї ж програми "вводить в оману.
Фредрік Гаусс

9

Нитки Демона схожі на помічників. Недемонські нитки схожі на виконавців. Асистенти допомагають виконавцям виконати роботу. Коли робота буде завершена, виконавці не потребують жодної допомоги для її виконання. Оскільки допомоги не потрібно, помічники залишають місце. Отже, коли завдання недемонових потоків закінчені, нитки Демона відходять убік.


5

Демон-потік - це як звичайний потік, за винятком того, що JVM закриється лише тоді, коли інших потоків, що не є демонами, не існує. Нитки Daemon, як правило, використовуються для виконання служб для вашої програми.


5

Потік Daemon на Java - це той потік, який працює у фоновому режимі і в основному створений JVM для виконання фонових завдань, таких як збирання сміття та інших завдань по догляду за будинком.

Бали до зауваження:

  1. Будь-який потік, створений головним потоком, який запускає основний метод на Java, за замовчуванням не є демоном, оскільки Thread успадковує свою демон-природу від Thread, який створює його, тобто батьківську нитку, а оскільки головна нитка - це недемонова нитка, будь-який інший потік, створений з неї, буде залишаються недемонними, поки явно не буде зроблено демон, зателефонувавши setDaemon (true).

  2. Thread.setDaemon (true) робить демона Thread, але його можна викликати лише до запуску Thread на Java. Він закине IllegalThreadStateException, якщо відповідна Тема вже запущена та запущена.

Різниця між потоком Daemon і Non Daemon на Java:

1) JVM не чекає завершення жодної демонової нитки до того, як існує.

2) Daemon Thread трактується інакше, ніж User Thread, коли JVM припиняється, нарешті блоки не викликаються, стеки не є розмовленими і JVM просто виходить.


5

У Java, Daemon Threads - це один із типів потоку, який не перешкоджає виходу віртуальної машини Java (JVM). Основна мета демонової нитки - виконувати фонове завдання, особливо у випадку якогось звичайного періодичного завдання чи роботи. Із виходом JVM гілка демона також гине.

Встановивши a thread.setDaemon(true), нитка стає демоновою ниткою. Однак ви можете встановити це значення лише до початку потоку.


Які ще є нитки, які роблять це? Відповідь: Ні. Існують демонові нитки та недемонові нитки, період. Це двійковий, Дві держави.
користувач207421

5

Ось приклад для перевірки поведінки потоків демона у випадку виходу jvm через відсутність потоків користувача.

Будь ласка, зверніть увагу на другий останній рядок у висновку нижче, коли основний потік вийшов, демонова нитка також відмерла і не надрукувала остаточно виконаний9 заяву в остаточному блоці. Це означає, що будь-які ресурси вводу-виводу, закриті в остаточному блоці демонової нитки, не будуть закриті, якщо JVM виходить через відсутність потоків користувача.

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

Вихідні дані

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

Нитки Daemon, як всі пояснювали, не обмежуватимуть JVM для виходу, тому в основному це щаслива нитка для Application з точки зору виходу.

Хочете додати, що демонні нитки можна використовувати, коли скажу, що я надаю такий API, як пересилання даних на сторонній сервер / або JMS, мені може знадобитися агрегувати дані на рівні JVM клієнта, а потім відправити JMS в окремий потік. Я можу зробити цей потік як демонову нитку, якщо це не обов'язкові дані, які слід пересилати на сервер. Цей вид даних схожий на натискання / агрегацію журналу.

З повагою, Маніш


Ось проста програма, що демонструє демонову нитку в Java. journaldev.com/1072/java-daemon-thread-example
Панкай

4

Потік Daemon - це як процес демон, який відповідає за управління ресурсами, демон VM Java створює нитку демона для обслуговування потоків користувача. Приклад оновлення системи для unix, unix - це демон-процес. child of daemon thread завжди є демоновою ниткою, тому за замовчуванням daemon false. Ви можете перевірити потік як демон або користувач, використовуючи метод "isDaemon ()". тому демонова нитка або процес демона в основному відповідають за управління ресурсами. наприклад, коли ви запускаєте jvm, працює сміттєзбірник, який є демоновою ниткою, пріоритет якої - найнижчий 1, а це керування пам'яттю. jvm живий до тих пір, поки користувацький потік живий, ви не можете вбити демонову нитку. jvm відповідає за вбивство демонових ниток.


Дуже заплутаний, і все "так" - це не послідовники.
користувач207421

3

Поговоримо лише в коді з робочими прикладами. Мені подобається відповідь Русса вище, але щоб усунути будь-які сумніви, я трохи посилив її. Я запускав її двічі, один раз із робочою ниткою, встановленою на deamon true (deamon thread), а інший раз встановив її false (користувальницька нитка). Це підтверджує, що деманова нитка закінчується, коли основна нитка закінчується.

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

Нитки Daemon, як правило, відомі як "Постачальник послуг". Ці потоки слід використовувати не для виконання програмного коду, а для системного коду. Ці потоки працюють паралельно вашому коду, але JVM може вбити їх будь-коли. Коли JVM не знаходить жодних потоків користувача, він зупиняє його, і всі потоки демонів миттєво припиняються. Ми можемо встановити недемонну нитку на демон, використовуючи:

setDaemon(true)

3
Вони зазвичай не відомі як "потоки" постачальника послуг ".
користувач207421

1
І їх можна використовувати для виконання будь-якого коду. JVM не може "вбити їх будь-коли", але він буде вбивати їх, коли не запущені недемонние потоки.
користувач207421

@EJP, можливо, я помиляюся, але "це вб'є їх", коли запущені недемонові нитки. Коли потік є демоном, чи не працює він окремо, тримаючи jvm, поки він не виконається повністю і тепер керується на рівні ОС.
89n3ur0n

Це вб'є їх, коли всі недемонові нитки вийдуть, а не пікосекунда раніше. Звичайно, не в будь-який час.
користувач207421

3

Нитки Демона - це потоки, які виконуються у фоновому режимі до тих пір, поки інші недемонові потоки процесу все ще запущені. Таким чином, коли всі недемонові потоки завершуються, нитки демона припиняються. Прикладом недемонової нитки є нитка, на якій працює головний. Нитка робиться демоном, викликаючи setDaemon()метод перед запуском потоку

Для отримання додаткової довідки: потік Daemon на Java


2

Для мене, демонова нитка - це як зберігач будинку для потоків користувачів. Якщо всі потоки користувачів закінчені, потік демона не має жодної роботи і вбивається JVM. Я пояснив це у відео YouTube .


2

JVM виконає роботу, коли завершиться останнє виконання недемонного потоку. За замовчуванням JVM створить нитку як недемон, але ми можемо зробити Thread як демон, за допомогою методу setDaemon(true). Хорошим прикладом нитки Daemon є нитка GC, яка завершить свою роботу, як тільки всі недемонові нитки будуть виконані.


як це може бути, як працює нитка GC? Чи не відбувається збір сміття, навіть якщо основний потік програми займає дуже багато часу (основний потік не закінчується)?
Калікодер

Як я вже згадував GC-потік буде працювати до кінця останнього потоку демонів NON, який виконає його виконання. Основний потік програми не є демоном, оскільки ми знаємо, отже, GC-потік виконає роботу, коли головний потік буде завершено / вбито. В основному я хочу сказати, що нитки демонів припиняються після завершення процесу, а процес завершується, коли всі потоки, що не є демоновими, виконуються.
Арман Туманян

За замовчуванням статус демона потоку успадковується від його батьківського.
користувач207421

-1

Демонові нитки гинуть, коли нитка творця виходить.

Недемонові потоки (за замовчуванням) можуть жити навіть довше, ніж основні.

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

Це неправильно. Мова не про творчі нитки. Якщо працює будь-який некористувальний потік, потоки демона продовжуватимуться працювати. Це можна легко перевірити, створивши нитку переднього плану, яка породить демонову нитку. Навіть після joinредагування нитки переднього плану демон буде залишатися стільки часу, поки буде запущена основна нитка.
Hubert Grzeskowiak

Демонові нитки відмирають, коли JVM не є більш запущеними недемонними нитками. Дивіться Javadoc. Відповідь абсолютно невірна.
користувач207421
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.