Daemon?
사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 시스템 로그를 남기는 syslogd처럼 보통 데몬을 뜻하는 ‘d’를 이름 끝에 달고 있으며, 일반적으로 프로세스로 실행된다.
- wikipedia
Daemon Thread
데몬은 백그라운드에서 실행되는 프로그램을 말한다.
데몬 스레드는 백그라운드에서 실행되는 스레드이다.
Thread
클래스의 setDaemon()
메서드를 통해 설정할 수 있다.
public final void setDaemon(boolean on) {
checkAccess();
if (isVirtual() && !on)
throw new IllegalArgumentException("'false' not legal for virtual threads");
if (isAlive())
throw new IllegalThreadStateException();
if (!isVirtual())
daemon(on);
}
void daemon(boolean on) {
holder.daemon = on;
}
만약 아래와 같은 스레드를 실행하면 어떻게 될까?
public class Main {
public static void main(String[] args) {
Thread daemonThread = new Thread(() -> {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
daemonThread.setDaemon(true); //데몬 스레드로 설정
daemonThread.start();
}
}
프로세스가 실행과 동시에 종료된다.
일반적으로 자바 프로그램은 하나의 스레드라도 동작하는 경우 종료되지 않는다.
하지만 이 데몬 스레드는 예외이다.
데몬 스레드는 데몬 스레드가 실행 중이더라도 다른 일반적인 스레드가 종료되었다면 프로세스와 함께 종료된다는 특징이 있다.
왜 필요한가?
데몬 스레드의 대표적인 사용처는 GC이다.
하지만 GC가 위의 예시처럼 setDaemon을 통해 설정되는 데몬스레드는 아니다.
우리가 작성한 코드가 정상적으로 실행되고 종료되었다면, 프로세스도 종료되어야 한다.
하지만 GC 관련 스레드가 데몬 스레드가 아니라면? 프로세스는 종료되지 않을 것이다.
이렇게 프로세스를 보조하는 역할을 수행하는 스레드는 보통 데몬 스레드로 동작한다.
다른 예시로 로깅과 모니터링이 있다. 로깅과 모니터링은 백그라운드에서 실행되는 것이 보통이다.
시스템 모니터링과 로깅 또한 위에서 언급한 것처럼 일반 스레드라면 프로세스가 정상적으로 종료되지 않을 것이다.
'JAVA' 카테고리의 다른 글
SOLID (0) | 2024.01.18 |
---|---|
BigDecimal 생성, 비교시 유의사항 (0) | 2024.01.17 |
GC 짚고 넘어가기 (1) | 2023.12.29 |
[JAVA 객체지향] 비즈니스 로직과 View의 의존성 배제하기 (0) | 2023.11.02 |
[JAVA 객체지향] getter의 사용을 지양하고 객체간 대화로 해결하자 (0) | 2023.10.30 |