데몬 스레드(daemon thread)
- 일반 스레드의 작업을 돕는 보조적인 역할을 수행
- 일반 스레드가 모두 종료되면 자동적으로 종료된다.
- 가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다.
- 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.
public void run() {
while(true) {
try{
Thread.sleep(3 * 1000); // 3초마다
} catch(InterruptedException e) { }
// autoSave의 값이 true이면 autoSave()를 호출한다.
if(autoSave) {
autoSave();
}
}
}
boolean isDaemon() 스레드가 데몬 스레드인지 확인한다. 데몬 스레드이면 true를 반환
void setDaemon(boolean on) 스레드를 데몬 스레드로 또는 사용자 스레드로 변경. 매개변수 on을 true로 지정하면 데몬 스레드가 된다.
일반 스레드의 작성방법 및 실행방법과 동일하고 스레드를 생성한 후 실행하기 전에 setDaemon()을 호출하면 된다.
setDaemon(boolean on)은 반드시 start()를 호출하기 전에 실행되어야 한다. 그렇지 않으면 IllegalThreadStateException이 발생한다.
class ThreadEx10 implements Runnable {
static boolean autoSave = false;
public static void main(String[] args) {
// main 스레드(일반 스레드)
Thread t = new Thread(new ThreadEx10()); // Thread(Runnable r)
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) {}
// autoSave의 값이 true이면 autoSave()를 호출한다.
if(autoSave) {
autoSave();
}
}
}
public void autoSave() {
System.out.println("작업파일이 자동저장되었습니다.");
}
}
스레드의 상태
- 스레드를 생성하고 start()를 호출하면 바로 실행되는 것이 아니라 실행 대기열에 저장되어 차례를 기다린다. 대기열은 큐(queue)와 같은 구조로 먼저 대기열에 들어온 스레드가 먼저 실행된다.
- 실행 대기 상태에 있다가 자신의 차례가 되면 실행상태가 된다.
- 주어진 실행시간이 다되거나 yield()를 만나면 다시 실행 대기 상태가 되고 다음 차례의 스레드가 실행 상태가 된다.
- 실행 중 suspend(), wait(), join(), I/O block에 의해 일시정지 상태가 될 수 있다. I/O block은 입출력 작업에서 발생하는 지연상태이다.
- 지정된 일시정지 시간이 다 되거나(time-out), notify(), resume(), interrupt()가 호출되면 일시정지 상태를 벗어나 다시 실행대기열에 저장되어 차례를 기다린다.
- 실행을 모두 마치거나 stop()이 호출되면 스레드는 소멸된다.
스레드의 실행 제어
- 스레드의 실행을 제어할 수 있는 메서드가 제공된다.
- 이들을 활용해서 보다 효율적은 프로그램을 작성할 수 있다.
sleep(), yield()는 스레드 자기 자신에게만 호출이 가능하다. 다시 말해 다른 스레드에게 적용할 수 없다.
'JAVA' 카테고리의 다른 글
[Thread] suspend(), resume(), stop() (0) | 2023.02.27 |
---|---|
[Thread] sleep(), interrupt()와 interrupted() (0) | 2023.02.26 |
[Thread] 스레드의 우선순위 (0) | 2023.02.26 |
[Thread] 싱글 스레드와 멀티 스레드, 스레드의 I/O 블로킹 (0) | 2023.02.26 |
[Thread] 프로세스와 스레드, 스레드의 구현과 실행 (0) | 2023.02.26 |