Что такое поток демона в Java? - PullRequest
735 голосов
/ 06 февраля 2010

Кто-нибудь может мне сказать, что за потоки демонов в Java?

Ответы [ 24 ]

586 голосов
/ 06 февраля 2010

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

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

323 голосов
/ 06 февраля 2010

Еще несколько баллов (Ссылка: Параллелизм Java на практике )

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

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

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

167 голосов
/ 09 марта 2012

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

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

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

Прочитайте Темы демона .

57 голосов
/ 11 мая 2012

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

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

Потоки демона обычно используются для выполнения сервисов для вашего приложения / апплета (например, загрузка "битов фиддли"). Основное различие между пользовательскими потоками и потоками демонов состоит в том, что JVM закроет программу только после завершения всех пользовательских потоков. Потоки демона завершаются 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>
33 голосов
/ 06 февраля 2010

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

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

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

32 голосов
/ 24 июля 2015

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

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

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

Что такое поток Daemon в Java?

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

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

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

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

12 голосов
/ 25 августа 2013

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

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

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

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

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

Есть еще ...

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