Ответ
Поток-демон (daemon thread) в Java — это фоновый поток, работа которого не препятствует завершению работы виртуальной машины (JVM). JVM завершает выполнение, как только все пользовательские (non-daemon) потоки завершили свою работу, даже если демон-потоки еще выполняются.
Основные отличия и правила:
- Назначение: Для фоновых задач, обслуживающих основные потоки (сборка мусора, мониторинг, логирование).
- Завершение: Потоки-демоны принудительно завершаются JVM и могут не успеть корректно завершить свою работу или освободить ресурсы.
- Наследование: Новый поток наследует статус демона от создавшего его потока.
- Ограничение: Нельзя сделать демоном уже запущенный поток (
IllegalThreadStateException).
Пример создания и использования:
Thread daemonThread = new Thread(() -> {
// Бесконечный цикл для демонстрации
while (true) {
try {
System.out.println("[Daemon] Фоновая задача...");
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("[Daemon] Поток прерван при завершении.");
break;
}
}
});
// Установка флага демона ДО запуска потока
// Без этой строки поток будет пользовательским (non-daemon)
daemonThread.setDaemon(true);
daemonThread.start();
// Главный (пользовательский) поток завершает работу через 3 секунды
Thread.sleep(3000);
System.out.println("Главный поток завершается. JVM закроется, даже если демон-поток еще работает.");
// JVM завершит daemonThread принудительно после этой точки.