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 потоков.
- Выполнится ли
finallydaemon-потока? Гарантии нет. - Можно ли изменить daemon после старта? Нет.
- Daemon всегда фоновый и медленный? Нет, планировщик не связывает daemon с приоритетом.