JVM chỉ chờ user thread.
Khi user thread cuối cùng kết thúc, JVM thoát và giết ngay mọi daemon thread đang chạy dở.
java
Thread cleaner = new Thread(this::sweepCache);
cleaner.setDaemon(true); // phải gọi TRƯỚC start()
cleaner.start(); // sau start() -> IllegalThreadStateExceptionHệ quả quan trọng: daemon bị dừng đột ngột, finally và shutdown logic có thể không chạy. Vì vậy không dùng daemon cho việc phải hoàn tất trọn vẹn — ghi file, flush buffer, commit transaction. Chỉ dùng cho tác vụ nền hỗ trợ có thể mất bất cứ lúc nào: heartbeat, dọn cache định kỳ, thu thập metric.
Mặc định thread mới kế thừa trạng thái daemon từ thread tạo ra nó; main là user thread nên thread bạn tạo trong main mặc định cũng là user thread. Các thread nội bộ của JVM (GC, JIT compiler) đều là daemon.