Что такое поток-демон (daemon thread) в Java?

«Что такое поток-демон (daemon thread) в Java?» — вопрос из категории Java Core, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Поток-демон (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 принудительно после этой точки.