데몬 스레드는 프로그램 실행이 완료될 때 JVM이 종료되는 것을 방지하지 않는 우선순위가 낮은 백그라운드 스레드입니다.
- 데몬 스레드는 사용자 스레드를 지원하기 위해 백그라운드에서 실행됩니다.
- 모든 사용자(비데몬) 스레드가 완료되면 JVM이 자동으로 종료됩니다.
- 동일한 Thread 클래스를 사용하여 생성되지만 setDaemon(true) 메서드를 사용하여 데몬으로 표시됩니다.
- 스레드가 시작되기 전에 setDaemon(true) 메소드를 호출해야 합니다.
- 일반적인 예로는 Garbage Collector 및 Finalizer Thread가 있습니다.
통사론
Javathread.setDaemon(true);
사용 사례
- 쓰레기 수거: Java의 GC(가비지 수집기)는 데몬 스레드로 실행됩니다.
- 백그라운드 모니터링: 데몬 스레드는 애플리케이션 구성 요소 리소스 또는 연결 상태를 모니터링할 수 있습니다.
- 로깅 및 감사 서비스: 데몬 스레드를 사용하여 백그라운드 활동을 지속적으로 기록할 수 있습니다.
- 정리 작업: 데몬 스레드는 주기적으로 임시 파일을 지워 사용하지 않는 리소스를 해제하거나 캐시 정리를 수행할 수 있습니다.
- 스케줄러 또는 타이머 작업: 백그라운드 스케줄러는 데몬 스레드를 사용하여 고정된 간격으로 작업을 트리거하는 경우가 많습니다.
사용된 방법
- 무효 setDaemon(부울 켜짐): 스레드를 데몬 또는 사용자 스레드로 표시합니다. start() 전에 호출해야 합니다.
- 부울 isDaemon(): 스레드가 데몬인지 확인합니다.
데몬 스레드 생성
Javapublic class DaemonExample extends Thread { public void run() { if (Thread.currentThread().isDaemon()) { System.out.println('Daemon thread running...'); } else { System.out.println('User thread running...'); } } public static void main(String[] args) { DaemonExample t1 = new DaemonExample(); DaemonExample t2 = new DaemonExample(); t1.setDaemon(true); // must be set before start() t1.start(); t2.start(); } }
산출
Daemon thread running... User thread running...
데몬 스레드의 동작
Javapublic class DaemonBehavior extends Thread { public void run() { while (true) { System.out.println('Daemon thread running...'); } } public static void main(String[] args) { DaemonBehavior t = new DaemonBehavior(); t.setDaemon(true); t.start(); System.out.println('Main (user) thread ends...'); } }
산출
Main (user) thread ends...
JVM은 데몬 스레드가 계속 실행 중이더라도 기본 스레드가 완료된 후 즉시 종료됩니다.
중요 사항
- 스레드는 자신을 생성한 스레드의 데몬 상태를 상속합니다.
- setDaemon(true) 메소드는 start() 이후에 호출되면 IllegalThreadStateException을 발생시킵니다.
- 파일 쓰기, 데이터베이스 업데이트 등 완료가 필요한 작업에는 데몬 스레드를 사용하면 안 됩니다.
- JVM은 정리 작업을 수행하지 않고 모든 데몬 스레드를 갑자기 종료합니다.
사용자 스레드와 데몬 스레드의 차이점
| 기초 | 사용자 스레드 | 데몬 스레드 |
|---|---|---|
| 목적 | 주요 애플리케이션 작업을 실행합니다. | 백그라운드 서비스 수행 |
| 수명주기 | 완료될 때까지 JVM을 활성 상태로 유지합니다. | 모든 사용자 스레드가 완료되면 종료됩니다. |
| 우선 사항 | 일반적으로 더 높음 | 보통 더 낮음 |
| JVM 종료 | JVM이 완료될 때까지 기다립니다. | JVM이 실행 중인데도 종료됩니다. |
| 예 | 기본 스레드 작업자 스레드 | 가비지 수집기 배경 모니터 |