потоки Java-демона - PullRequest
       1

потоки Java-демона

2 голосов
/ 30 декабря 2011

Привет всем, перестанет ли работать поток демона, когда завершающий поток завершится? Или поток демона остановится, когда закончится основной поток?

Я тестировал этот пример на jre6, и результат был daemon thread stopped working when the enclosing it thread finished. Обратите внимание, что в документации по Java сказано, что потоки демона уничтожаются, когда не осталось других потоков приложения. И не сказано, что потоки демона уничтожаются, когда остается родительский поток, не являющийся демоном.

Пожалуйста, дайте мне ответы. Пожалуйста, пришлите мне любой материал по этому вопросу. Извините за мой английский.

public class Main {
    public static void main(String[] args) {
        Thread simple = new Thread(new SimpleTask());
        simple.start();
    }
}

class SimpleTask implements Runnable {
    public void run() {
        try {
            Thread daemon = new Thread(new DaemonTask());
            daemon.setDaemon(true);
            daemon.start();
            Thread.sleep(5000);
        } catch (InterruptedException e) {}
    };
}

class DaemonTask implements Runnable {
    public void run() {
        int i = 0;
        while (true) {
            try {
                System.out.println("a" + (i++));
                Thread.sleep(500);
            } catch (InterruptedException e) {}
        }
    }
}

Ответы [ 4 ]

11 голосов
/ 30 декабря 2011

перестанет ли работать поток демона, когда завершающий поток завершится?

В Java не существует такого понятия, как «закрывающий поток». Существуют нити групп , но они используются редко.

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

3 голосов
/ 30 декабря 2011

Привет всем, поток демонов перестанет работать, когда поток будет закрыт закончу? Или поток демонов остановится, когда основной поток закончить?

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

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

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

Тогда поток демона - это поток, который не удерживает вашу программу от выхода . Для получения дополнительной информации, проверьте этот старый вопрос SO.

Проверьте API потока . Документация для setDaemon() методов отчетов ниже:

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

Или API времени выполнения :

Виртуальная машина Java отключается в ответ на два вида события:

1) Программа выходит нормально, когда выходит последний поток, не являющийся демоном, или когда вызывается метод выхода (эквивалентно System.exit) или

2) Виртуальная машина завершает работу в ответ на пользовательское прерывание, такой как ввод ^ C, или общесистемное событие, такое как выход пользователя из системы или выключение системы.

1 голос
/ 30 декабря 2011

Поток Daemon прекратил работу из-за того, что не осталось ни одного потока, не являющегося демоном, и НЕ из-за завершения родительского потока.

1 голос
/ 30 декабря 2011

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

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

...