Что такое поток демона в Java?

691

Может ли кто-нибудь сказать мне, какие потоки демона находятся в Java?

  • 20
    Thread Javadoc описывает то , что они: java.sun.com/javase/6/docs/api/java/lang/Thread.html
  • 1
    answers.com/Q/What_is_a_daemon_thread
Показать ещё 1 комментарий
Теги:
multithreading

25 ответов

586

Демон-поток - это поток, который не предотвращает выход JVM, когда программа заканчивается, но поток все еще работает. Примером для потока демона является сбор мусора.

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

  • 197
    Для потомков setDamon(boolean) может быть вызван только до того, как поток был запущен. По умолчанию поток наследует состояние демона своего родительского потока.
  • 0
    «не препятствует выходу JVM после завершения программы, но поток все еще работает», в то время как @sateesh говорит, что «JVM останавливает все оставшиеся потоки демона, которые были оставлены». Итак, завершаются ли потоки демонов при выходе из JVM?
Показать ещё 8 комментариев
311

Еще несколько моментов (Ссылка: Java Concurrency in Practice)

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

    • наконец блоки не выполняются,
    • стеки не разматываются - JVM просто выходит.

    По этой причине потоки демонов следует использовать с осторожностью, и их опасно использовать для задач, которые могут выполнять любые операции ввода-вывода.

  • 3
    Почему нельзя использовать потоки демона для ввода / вывода? Это беспокойство по поводу того, что BufferedWriters и т. Д. Не сбрасываются?
  • 3
    @PaulCager Да, они могут быть просто отрезаны в коленях во время записи / чтения.
Показать ещё 7 комментариев
155

Все вышеприведенные ответы хороши. Вот простой небольшой фрагмент кода, чтобы проиллюстрировать разницу. Попробуйте с каждым из значений 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 a user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it 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
            }
        }
    }
}
  • 1
    @russ Хороший фрагмент кода! Я должен был определить класс WorkerThread как статический.
  • 0
    @ xli, вы могли бы также сделать новый DaemonTest (). new WorkerThread (). start () :)
Показать ещё 2 комментария
97

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

Нить демона в Java - это тот, который не препятствует выходу JVM. В частности, JVM выйдет, когда остаются только потоки демона. Вы создаете его, вызывая метод setDaemon() на Thread.

Прочитайте темы Daemon.

  • 3
    ваша ссылка на данный момент не работает, возможно, вы хотите обновить? в любом случае +1 для вас.
  • 4
    ссылка работает для меня
Показать ещё 2 комментария
53

Темы Daemon похожи на поставщиков услуг для других потоков или объектов, работающих в том же процессе, что и поток демона. Потоки Daemon используются для поддержки фоновых задач и необходимы только при выполнении обычных потоков. Если нормальные потоки не выполняются, а оставшиеся потоки являются потоками демона, то интерпретатор завершает работу.

Например, браузер HotJava использует до четырех потоков демона с именем "Image Fetcher" для извлечения изображений из файловой системы или сети для любого потока, который нуждается в нем.

Темы демона обычно используются для выполнения сервисов для вашего приложения/апплета (например, загрузки "фиктивных бит" ). Основное различие между потоками пользователей и потоками демона заключается в том, что JVM будет только закрывать программу, когда все пользовательские потоки прекратятся. Потоки Daemon прерываются JVM, когда больше нет пользовательских потоков, включая основной поток выполнения.

setDaemon (true/false)? Этот метод используется для указания, что поток является потоком демона.

public boolean isDaemon()? Этот метод используется для определения потока - поток демона или нет.

Например:

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

Демон-демона - это поток, который рассматривается как выполняющий некоторые задачи в фоновом режиме, такие как запросы обработки или различные хронограммы, которые могут существовать в приложении.

Когда ваша программа будет иметь только оставшиеся демонные потоки, она выйдет. Это потому, что обычно эти потоки работают вместе с обычными потоками и обеспечивают фоновую обработку событий.

Вы можете указать, что Thread является демоном с помощью метода setDaemon, они обычно не выходят, и они не прерываются. Они просто останавливаются, когда приложение останавливается.

  • 1
    Это потому, что это поток демона, и это означает «демон». Ваши рассуждения вернулись на фронт.
25

Определение демона (вычислительного):

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

—— Источник: английский от Оксфордских словарей

Что такое поток демонов в Java?

  • Потоки демона могут в любой момент прерваться между своими потоками, не-демон, т.е. пользовательский поток выполняется полностью.
  • Потоки демона выполняются с низким приоритетом.
  • Потоки демона - это потоки, которые периодически запускаются в фоновом режиме, пока работают другие потоки, не являющиеся демонами.
  • Когда все потоки не-демона завершены, потоки-демоны завершаются автоматически.
  • Потоки демона являются поставщиками услуг для пользовательских потоков, работающих в одном и том же процессе.
  • JVM не заботится о том, чтобы потоки демона могли завершиться в состоянии "Выполнено", даже блок "наконец" также не позволяет выполнять. JVM отдает предпочтение созданным нами потокам, не являющимся демонами.
  • Потоки демона действуют как службы в Windows.
  • JVM останавливает потоки демона, когда все пользовательские потоки (в отличие от потоков демона) завершаются. Следовательно, потоки демона могут использоваться, например, для реализации функциональности мониторинга, поскольку поток останавливается JVM, как только все пользовательские потоки останавливаются.
  • 0
    если вы вызываете System.exit (), блоки finally не выполняются, независимо от того, является ли поток потоком демона. действительно, наконец, блоки выполняются в потоках демона даже после завершения последнего пользовательского потока, если JVM еще не уничтожила поток
  • 3
    Поток демона выполняется с тем же приоритетом, что и поток его создания, если только он не был изменен до запуска. Потоки демонов не обязательно являются «поставщиками сервисов», или сервисами Windows, или чем-то еще, что здесь указано: они просто потоки, которые не препятствуют выходу JVM. Период.
15

Одно заблуждение, которое я хотел бы уточнить:

  • Предположим, что если поток демона (скажем, B) создается в пользовательском потоке (скажем, А); то завершение этого пользовательского потока/родительского потока (A) не закончится поток потока/дочерний поток демона (B), который он создал; если пользовательский поток является единственным один в настоящее время работает.
  • Таким образом, нет отношения родитель-потомок к завершению потока. Все потоки демона (независимо от того, где они созданы) завершатся, если нет ни одного живого потока пользователей, и это приведет к завершению работы JVM.
  • Даже это верно для обоих (parent/child) - это потоки демона.
  • Если дочерний поток создан из потока демона, то это также поток демона. Это не потребует установки явного флага потока демона. Аналогично, если дочерний поток, созданный из пользовательского потока, который также является потоком пользователя, если вы хотите его изменить, тогда перед началом этого дочернего потока необходимо установить явный флаг флага демона.
  • 0
    Это не процитировано ни от чего. Не используйте форматирование цитаты для текста, который не цитируется. Первый абзац «цитаты» неверен и противоречит второму.
  • 0
    @ EJP ПОЛУЧИЛ ЭТО, так что каждый должен давать цитаты другим людям, а не своим. ИЛИ сами что-то цитировали, тогда укажите здесь
12

В Java есть специальный поток, называемый потоком daemon.

  • Очень низкий приоритет.
  • Выполняется только тогда, когда ни один другой поток одной и той же программы не запущен.
  • JVM завершает программу, завершающую эти потоки, когда потоки демона единственные потоки, запущенные в программе.

Для чего используются потоки демона?

Обычно используется как поставщик услуг для обычных потоков. Обычно имеют бесконечный цикл, который ждет запроса на обслуживание или выполняет задачи потока. Они не могут выполнять важные задания. (Потому что мы не знаем, когда у них будет время процессора, и они могут закончить любое время, если нет других потоков.)

Типичным примером такого рода потоков является сборщик мусора Java.

Там больше...

  • Вы вызываете метод setDaemon() только после вызова метода start(). После того, как поток запущен, вы не можете изменить его статус демона.
  • Используйте метод isDaemon(), чтобы проверить, является ли поток потоком демона или пользовательским потоком.
  • 7
    -1, я не верю, что поток демона по своей природе имеет низкий приоритет. Конечно, нет документации я видел такие состояния. Также этот ответ SO утверждает, что приоритет и демон являются ортогональными: stackoverflow.com/a/10298353/839128
  • 4
    Потоки демона не имеют ничего общего с приоритетом. Вы можете иметь поток демона с высоким приоритетом или поток демона с низким приоритетом.
Показать ещё 1 комментарий
12

Тема и потоки пользователей Daemon. Как правило, все потоки, созданные программистом, представляют собой пользовательский поток (если вы не укажете его как демона, или ваш родительский поток - поток демона). Пользовательский поток обычно предназначен для запуска нашего программного кода. JVM не завершается, если весь пользовательский поток не завершится.

7

Демон-потоки подобны помощникам. Нитевидные потоки похожи на передние исполнители. Помощники помогают исполнителям завершить работу. Когда работа завершена, исполнителям больше не нужна помощь. Поскольку помощь не нужна, ассистенты покидают место. Поэтому, когда работы потоков Non-Daemon завершены, потоки Daemon отходят.

5

поток Daemon в Java - это поток, который работает в фоновом режиме и в основном создается JVM для выполнения фоновой задачи, такой как сборка мусора и другие задачи сохранения дома.

Примечание:

  • Любой поток, созданный основным потоком, который запускает главный метод в Java, по умолчанию не является демоном, потому что Thread наследует его характер демона от Thread, который создает его, т.е. родительский поток, и поскольку основной поток является потоком не-демона, любой другой поток, созданный из него, останется не-демоном, пока явно не будет сделан демон, вызвав setDaemon (true).

  • Thread.setDaemon(true) создает демон Thread, но его можно вызвать только после запуска Thread в Java. Он выкинет IllegalThreadStateException, если соответствующий Thread уже запущен и запущен.

Разница между потоком Daemon и Non Daemon в Java:

1) JVM не дожидается завершения любого потока демона до существующего.

2) Демона Thread обрабатываются иначе, чем User Thread, когда JVM завершается, наконец, блоки не вызываются, стеки не разматываются, а JVM просто выходит.

5

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

4

Темы демона обычно называются потоком "Поставщик услуг". Эти потоки не должны использоваться для выполнения программного кода, но системного кода. Эти потоки выполняются параллельно вашему коду, но JVM может убивать их в любое время. Когда JVM не находит ни одного пользовательского потока, он останавливает его, и все потоки демона немедленно завершаются. Мы можем установить поток не-daemon для демона, используя:

setDaemon(true)
  • 2
    Они не «обычно известны как« потоки поставщика услуг ».
  • 0
    И они могут быть использованы для выполнения любого кода. JVM не может «убить их в любое время», но это будет убивать их , когда нет не-демон нити работает.
Показать ещё 1 комментарий
4

В Java потоки Daemon являются одним из типов потока, который не препятствует выходу Java Virtual Machine (JVM). Основной целью потока демона является выполнение фоновой задачи, особенно в случае некоторой обычной периодической задачи или работы. С выходами JVM поток демонов также умирает.

Установив thread.setDaemon(true), поток становится потоком демона. Однако вы можете установить это значение только до начала потока.

  • 0
    Каковы другие типы потоков, которые делают это? A: Нет. Существуют потоки демонов и не демонов, точка. Это двоичный файл, два состояния.
4

поток Daemon похож на процесс daemon, который отвечает за управление ресурсами, поток демона создается виртуальной машиной Java для обслуживания пользовательских потоков. пример системы обновления для unix, unix - процесс демона. child of daemon thread - это всегда поток демона, поэтому по умолчанию daemon is false. Вы можете проверить поток как демон или пользователя с помощью метода isDaemon(). поэтому процесс демона или процесса демон в основном отвечает за управление ресурсами. например, при запуске jvm работает сборщик мусора, который является потоком демона, приоритет которого равен 1, который является самым низким, который управляет памятью. jvm жив до тех пор, пока пользовательский поток жив, u не может убить демона thread.jvm отвечает за уничтожение потоков демона.

  • 0
    Очень запутано, и все это не являются следствием.
4

Демоны, как все объясняют, не будут ограничивать JVM для выхода, поэтому в основном это счастливый поток для приложения с точки зрения выхода.

Хотите добавить, что потоки демона могут использоваться, когда я предоставляю API, например, толкаю данные на сторонний сервер /JMS, мне может потребоваться агрегировать данные на уровне JVM клиента, а затем отправить в JMS в отдельный поток. Я могу сделать этот поток потоком демона, если это не обязательные данные, которые нужно отправить на сервер. Такие данные подобны логарифмическому нажатию/агрегации.

С уважением, Маниш

3

Любой поток Java может быть потоком демона.

Потоки Daemon - это поставщики услуг для других потоков, работающих в том же процессе, что и поток демона. Например, браузер HotJava использует до четырех потоков демона с именем "Image Fetcher" для извлечения изображений из файловой системы или сети для любого потока, который ему нужен. Метод run() для потока демона обычно представляет собой бесконечный цикл, ожидающий запроса на обслуживание. Когда единственными оставшимися потоками процесса являются потоки демона, интерпретатор завершает работу. Это имеет смысл, потому что, когда остаются только потоки демона, нет другого потока, для которого поток демона может предоставить услугу.

Чтобы указать, что поток является потоком демона, вызовите метод setDaemon с аргументом true. Чтобы определить, является ли поток потоком демона, используйте метод isDaemon.

Надеюсь, это поможет !!!!!!

  • 2
    Плагиат отсюда .
3

Потоки Daemon - это потоки, которые выполняются в фоновом режиме, пока другие потоки не-демона процесса все еще работают. Таким образом, когда все потоки не-daemon завершены, потоки демона прекращаются. Примером не-демона является поток, на котором выполняется Main. Нить создается демоном, вызывая метод setDaemon() до начала потока

Дополнительная ссылка: поток Daemon в Java

  • 0
    Ваша ссылка на блог не работает ..
2

JVM выполнит работу, когда завершено выполнение последнего не-демона. По умолчанию JVM создаст поток как nondaemon, но мы можем сделать Thread в качестве демона с помощью метода setDaemon(true). Хорошим примером потока Daemon является поток GC, который завершит его работу, как только будут завершены все потоки nondaemon.

  • 0
    как это может быть, как работает поток GC? Не запускается ли сборка мусора, даже если основной поток программы занимает очень много времени (основной поток не прерывается)?
  • 0
    Как я уже говорил, поток GC будет работать до конца последнего потока NON-демона, который завершит свое выполнение. Как мы знаем, основной поток программы не является демоном, поэтому поток GC выполнит работу, как только основной поток будет завершен / уничтожен. По сути, я хочу сказать, что поток (ы) демона будет прерван, когда процесс завершится, и процесс завершится, когда будут выполнены все потоки, не являющиеся демонами.
2

Говорите только в коде с рабочими примерами. Мне нравится russ ответить выше, но чтобы устранить любые сомнения, которые у меня были, я немного улучшил его. Я запускал его дважды, один раз, когда рабочий поток был установлен на deamon true (поток деамонов), а другой раз установил его в false (пользовательский поток). Он подтверждает, что резьба deamon заканчивается, когда основной поток заканчивается.

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 a user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it 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
2

Для меня, daemon нить это, как house keeper для пользовательских потоков. Если все пользовательские потоки закончены, поток демона не имеет работы и убит JVM. Я объяснил это в видео YouTube.

1

Ниже приведен пример проверки поведения потоков демона в случае выхода jvm из-за отсутствия пользовательских потоков.

Обратите внимание на вторую последнюю строку на выходе ниже, когда основной поток вышел, поток демона также умер и не распечатывал окончательно выполненную инструкцию в блоке finally. Это означает, что любые ресурсы i/o, закрытые в конечном блоке потока демона, не будут закрыты, если 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
1

Линии демонов умирают, когда поток создателя завершается.

Ненонные потоки (по умолчанию) могут даже жить дольше, чем основной поток.

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

поток Daemon в java - это поток поставщика услуг, который предоставляет услуги пользовательскому потоку. Его жизнь зависит от милосердия пользовательских потоков, то есть когда все пользовательские потоки умирают, JVM автоматически завершает этот поток.

  • Он предоставляет услуги пользовательским потокам для поддержки фоновых задач. Он не имеет никакой роли в жизни, чем обслуживать пользовательские потоки.
  • Его жизнь зависит от пользовательских потоков.
  • Это поток с низким приоритетом.

Единственная цель потока демона заключается в том, что он предоставляет услуги пользовательскому потоку для поддержки фоновой задачи. Если нет пользовательского потока, JVM завершает поток демона.

public class Solution extends Thread {
    public static void main(String[] args) {
        System.out.println("Main Method Entry");

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

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

        }

        System.out.println("Main Method Exit");
    }

    public void run() {
        System.out.println("run Method Entry");

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

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

                }

                System.out.println("In run method.." + Thread.currentThread());
            }
        } finally {
            System.out.println("run Method Exit");
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню