본문

데몬쓰레드(Daemon thread)

반응형

# 데몬쓰레드(Daemon thread)

컴퓨터 시스템의 운영에 관련된 작업을 후선(background) 상태로 동작하면서 실행하는 프로그램. 

처리해야 할 작업 조건이 발생하면 자동으로 작동하여 필요한 작업을 실행한다.


일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료되는데, 그 이유는 데몬 쓰레드는 일반 쓰레드의 보조 역할을 수행하므로 일반 쓰레드가 모두 종료되고 나면 데몬 쓰레드의 존재의 의미가 없기 때문이다. 이 점을 제외하고는 데몬 쓰레드와 일반 쓰레드는 다르지 않다. 데몬 쓰레드의 예로는 가비지 컬렉션, 워드 프로세서의 자동저장, 화면 자동갱신 등이 있다. 


데몬 쓰레드는 무한 루프와 조건문을 이용해서 실행 후 대기하고 있다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다. 데몬 쓰레드는 일반 쓰레드의 작성 방법과 실행 방법이 같으며, 다만 쓰레드를 생성한 다음 실행하기 전에 setDaemon(true)를 호출하기만 하면 된다. 


1
2
3
4
5
6
// 쓰레드가 데몬 쓰레드인지 확인한다. 데몬 쓰레드이면 true 반환한다.
boolean isDaemon()  
 
// 쓰레드를 데몬 쓰레드 또는 사용자 쓰레드로 변경한다.
// (매개변수 on의 값을 true로 지정하면 데몬 쓰레드가 된다.)
void setDaemon(boolean on)  
cs


sample) 이 쓰레드를 데몬 쓰레드로 설정하지 않았다면 계속 무한 루프를 돌게된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.aimir.bo.device;
 
class DaemonExample implements Runnable {
    static boolean autoSave = false;
 
    public static void main(String[] args) {
        Thread t = new Thread(new DaemonExample());
        t.setDaemon(true); // 이 부분이 없으면 종료되지 않는다.
 
        // main 쓰레드가 종료되면 종속쓰레드인 t쓰레드도 종료된다.
        t.start();
 
        for (int i = 1; i <= 20; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
 
            System.out.println(i);
 
            if (i == 5) {
                autoSave = true;
            }
        }
 
        System.out.println("프로그램을 종료합니다.");
    }
 
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(3 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
 
            if (autoSave) {
                autoSave();
            }
        }
    }
 
    private void autoSave() {
        // TODO
        System.out.println("작업파일이 자동저장되었습니다.");
    }
 
}
 
cs


result)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
11
작업파일이 자동저장되었습니다.
12
13
14
작업파일이 자동저장되었습니다.
15
16
17
작업파일이 자동저장되었습니다.
18
19
20
프로그램을 종료합니다.
 
cs


3초마다 변수 autoSave의 값을 확인해서 그 값이 true이면, autoSave()를 호출하는 일을 무한히 반복하도록 쓰레드를 작성하였다. 만일 이 쓰레드를 데몬 쓰레드로 설정하지 않았다면, 이 프로그램은 강제종료하지 않는 한 영원히 종료되지 않을 것이다. setDaemon 메서드는 반드시 start()를 호출하기 전에 실행되어야 한다. 그렇지 않으면 IllegalThreadStateException이 발생한다.




- 출처

http://terms.naver.com/entry.nhn?docId=1611073&cid=50372&categoryId=50372

http://devbox.tistory.com/entry/Java-%EB%8D%B0%EB%AA%AC%EC%93%B0%EB%A0%88%EB%93%9C


반응형

공유

댓글