[Thread] Daemon Thread
데몬 스레드는 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드
일반 스레드가 모두 종료되면 데몬 스레드는 자동 종료된다. 일반 스레드의 보조역할을 수행하므로 일반 스레드가 없으면 존재의미가 없기 때문이다.
데몬 스레드- 가비지 컬렉터, 워드프로세서의 자동저장, 화면자동갱신 등이 있다.
데몬 스레드는 일반 스레드의 작성방법과 실행방법이 같으며 스레드를 생성한 후 실행전에 setDaemon(true)를 호출하기만 하면 된다.
데몬 스레드가 생성한 스레드는 자동적으로 데몬 스레드가 된다.
스레드가 데몬 스레드인지 일반 스레드인지 확인하는 메서드 스레드참조변수.isDaemon() -> boolean리턴
데몬 스레드는 무한루프와 조건문을 이용하여 실행 후 대기하고 있다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.
public class DaemonThreadTest implements Runnable {
static boolean autoSave = false;
public static void main(String[] args) {
Thread t = new Thread(new DaemonThreadTest());
t.setDaemon(true);
// 이 부분이 없으면 메인 스레드가 종료되어도 이 스레드는 종료되지 않는다.
t.start();
for(int i=1; i <= 10; i++) {
try{
Thread.sleep(1000);
} catch(InterruptedException e) {}
System.out.println(i);
if(i==5)
autoSave = true;
}
System.out.println("프로그램을 종료합니다.");
}
public void run() {
while(true) {
try {
Thread.sleep(3 * 1000); // 3초마다
} catch(InterruptedException e) {}
if(autoSave) { //// autoSave의 값이 true이면 autoSave()를 호출한다.
autoSave();
}
}
}
public void autoSave() {
System.out.println("작업파일이 자동저장되었습니다.");
}
}
결과
1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
프로그램을 종료합니다.
isDaemon(true)를 설정하지 않으면 10초가 지나도 메인스레드는 종료되었지만(프로그램을 종료합니다)
생성한 스레드 t는 영원히 돌게 된다.
1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
프로그램을 종료합니다.
작업파일이 자동저장되었습니다. //종료되지 않은 우리가 돌리고 있는 스레드
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
setDaemon()메서드는 start()를 호출하기 전에 실행되어야 한다. 그렇지 않으면 IllegalThreadStateException이 발생한다.