Daemon-поток

Daemon — служебный поток, который сам по себе не удерживает JVM запущенной. Когда завершились все non-daemon потоки, JVM может прекратить работу, не дожидаясь finally daemon-потоков. Virtual threads (Java 21+) всегда daemon; ниже речь о platform thread.

Thread cleaner = new Thread(this::cleanupLoop, "cache-cleaner");
cleaner.setDaemon(true);
cleaner.start();

Свойства

  • статус наследуется от потока-родителя;
  • setDaemon(true) вызывают до start(), иначе будет IllegalThreadStateException;
  • daemon не означает низкий приоритет;
  • daemon не означает автоматическую остановку или безопасность;
  • shutdown hook — отдельный механизм и запускается при штатной процедуре завершения JVM.

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

Корректный сервис все равно получает явный сигнал остановки и освобождает ресурсы. Статус daemon — страховка жизненного цикла JVM, а не протокол shutdown.

На собеседовании

  • Когда JVM может завершиться? Когда не осталось живых non-daemon потоков.
  • Выполнится ли finally daemon-потока? Гарантии нет.
  • Можно ли изменить daemon после старта? Нет.
  • Daemon всегда фоновый и медленный? Нет, планировщик не связывает daemon с приоритетом.