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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

Все вышеприведенные ответы хороши. Вот простой небольшой фрагмент кода, чтобы проиллюстрировать разницу. Попробуйте с каждым из значений 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
            }
        }
    }
}

Ответ 4

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

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

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

Ответ 5

Темы 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>

Ответ 6

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

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

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

Ответ 7

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

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

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

Что такое нить Daemon в Java?

  • Потоки демона могут в любой момент прерваться между своими потоками, а не-демон, то есть пользовательский поток, выполняется полностью.
  • Потоки демона - это потоки, которые периодически запускаются в фоновом режиме, пока работают другие потоки, не являющиеся демонами.
  • После завершения всех потоков, не являющихся демонами, потоки демонов завершаются автоматически.
  • Потоки демона являются поставщиками услуг для пользовательских потоков, работающих в одном и том же процессе.
  • JVM не заботится о том, чтобы потоки демона завершались, когда он находится в состоянии Running, даже блок finally не позволяет выполнять. JVM отдает предпочтение созданным нами потокам, не являющимся демонами.
  • Потоки демонов действуют как сервисы в Windows.
  • JVM останавливает потоки демона, когда все пользовательские потоки (в отличие от потоков демона) завершаются. Следовательно, потоки демона могут использоваться, например, для реализации функциональности мониторинга, поскольку поток останавливается JVM, как только все пользовательские потоки останавливаются.

Ответ 8

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

  • Предположим, что если поток демона (скажем, B) создается в пользовательском потоке (скажем, А); то завершение этого пользовательского потока/родительского потока (A) не закончится поток потока/дочерний поток демона (B), который он создал; если пользовательский поток является единственным один в настоящее время работает.
  • Таким образом, нет отношения родитель-потомок к завершению потока. Все потоки демона (независимо от того, где они созданы) завершатся, если нет ни одного живого потока пользователей, и это приведет к завершению работы JVM.
  • Даже это верно для обоих (parent/child) - это потоки демона.
  • Если дочерний поток создан из потока демона, то это также поток демона. Это не потребует установки явного флага потока демона. Аналогично, если дочерний поток, созданный из пользовательского потока, который также является потоком пользователя, если вы хотите его изменить, тогда перед началом этого дочернего потока необходимо установить явный флаг флага демона.

Ответ 9

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

Ответ 10

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

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

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

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

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

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

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

Ответ 11

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

Ответ 12

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

Ответ 13

поток 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 просто выходит.

Ответ 14

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

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

Ответ 15

Ниже приведен пример проверки поведения потоков демона в случае выхода 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

Ответ 16

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

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

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

Ответ 17

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

Ответ 18

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

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

Ответ 19

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

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

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

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

Ответ 20

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

setDaemon(true)

Ответ 21

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

Ответ 22

Говорите только в коде с рабочими примерами. Мне нравится 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

Ответ 23

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

Ответ 24

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

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

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

Ответ 25

поток 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");
        }
    }
}