Daemon Thread (데몬 쓰레드)
멀티태스킹 운영체제에서 데몬(Daemon_은 사용자가 직접 제어하지 않고, 백그라운드에서 돌아가면서 작업을 하는 프로그램을 말한다. 이름의 유래는 MAC개발자들이 맥스웰의 도깨비 사고실험(보이지 않는 곳에서 스스로 분자를 골라내는 일을 하고 있는 도깨비)에서 영감을 얻어 도깨비, 악마라는 뜻의 Daemon을 사용했고, 유닉스 시스템이 이 용어를 채용하여 사용하면서 굳어졌다.
데몬쓰레드의 또 다른 특징은 일반 쓰레드가 모두 종료되면 데몬쓰레드는 강제로 종료된다는 것이다. 일반적으로 데몬쓰레드는 가비지 컬렉터, 화면 자동 갱신 등의 작업을 실행하는데 쓰인다. 데몬쓰레드는 무한 루프와 조건문을 이용해서 무한히 대기하고 있다가 특정 조건이 만족되면 작업을 실행하고, 다시 대기하게 된다.
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws InterruptedException {
AutoSaveThread autosave = new AutoSaveThread();
autosave.setDaemon(true);
autosave.start();
for (int i = 0; i <= 10; i++) {
TimeUnit.SECONDS.sleep(1);
System.out.print("current : " + i * 10 + "min. ");
autosave.setAutosave(i % 2 == 0);
if (!autosave.isAutosave())
System.out.println();
}
TimeUnit.SECONDS.sleep(1);
}
}
class AutoSaveThread extends Thread {
private boolean autosave = false;
public boolean isAutosave() {
return autosave;
}
public void setAutosave(boolean autosave) {
this.autosave = autosave;
}
@Override public void run() {
while (true) {
try {
TimeUnit.MILLISECONDS.sleep(999);
// 오버헤드 영향으로 1ms 빠르게
if (autosave)
System.out.println("auto saved complete");
} catch (InterruptedException ignored) {
}
}
}
}
current : 0min. auto saved complete
current : 10min.
current : 20min. auto saved complete
current : 30min.
current : 40min. auto saved complete
current : 50min.
current : 60min. auto saved complete
current : 70min.
current : 80min. auto saved complete
current : 90min.
current : 100min. auto saved complete
Process finished with exit code 0
데몬쓰레드를 직접 사용해보자. 이 소스코드는 20분에 한번씩 프로그램의 결과를 자동저장하는 소스코드이다. (편의상 10분 당 1초로 구현하였다) 이 때 AutoSave를 담당하는 데몬쓰레드의 경우 while문을 사용하여 무한루프를 돌고 있지만, main 쓰레드가 끝나면 함께 끝나게 된다. 만약 데몬쓰레드가 아닌 일반쓰레드로 구현하였다면 결과는 아래와 같을 것이다.
current : 0min. auto saved complete
current : 10min.
current : 20min. auto saved complete
current : 30min.
current : 40min. auto saved complete
current : 50min.
current : 60min. auto saved complete
current : 70min.
current : 80min. auto saved complete
current : 90min.
current : 100min. auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
auto saved complete
...
무한루프
이렇게 보통 데몬쓰레드는 계속 대기하고 있다가 특정 조건이 되면 작업을 실행하는 경우에 자주 사용될 수 있고, 기존 쓰레드가 모두 끝나면 데몬쓰레드도 함께 종료된다는 특징이 있다.
'자바' 카테고리의 다른 글
자바 쓰레드 (5) - 쓰레드 제어 (1) (0) | 2020.04.19 |
---|---|
자바 쓰레드 (3) - 쓰레드 그룹 (Thread Group) (0) | 2020.04.19 |
자바 쓰레드 (2) - start() vs run() (0) | 2020.04.19 |
자바 쓰레드 (1) - 쓰레드란 무엇인가? (0) | 2020.04.19 |