자바/자바 기본

데몬쓰레드(daemon thread)

은은하게미친자 2022. 7. 6. 01:05
728x90

: 일반쓰레드의 작업을 돕는 보조쓰레드. 일반 쓰레드가 모두 종료되면 데몬쓰레드는 강제적으로 자동 종료된다.

일반쓰레드의 작성방법과 실행방법이 같으며, 쓰레드를 생성한 다음 실행하기전에 setDamon(true)를 호출하면된다.

데몬쓰레드가 생성한 쓰레드는 자동으로 데몬 쓰레드가 된다.

 

반드시 start()를 호출하기전에  setDamon(true)할것. 아닐경우 illegalThreadStateExeption 발생

ex) 가비지컬렉터, 워드프로세서의 자동저장, 화면 자동갱신

boolean isDamon()  쓰레드가 데몬 쓰레드인지 확인한다. 데몬쓰레드이면 true
void setDamon(boolean on) 쓰레드를 데몬 쓰레드 또는 사용자 쓰레드로 변경한다. 매개변수 on의 값을 true로 지정하면 데몬쓰레드가 된다.

 

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
package kr.co.threadtest;
 
public class ThreadEx10 implements Runnable {
    
    static boolean autosave = false;
    public static void main(String[] args) {
        Thread t = new Thread(new ThreadEx10());
        
        t.setDaemon(true); // 요거 없으면 계속 저장...
        t.start();
        
        for(int i=1; i<=10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(i);
            
            if(i==5)
                autosave =true;
        }
    }
 
    public void run() {
        while(true) {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(autosave) {
                autoSave();
            }
        }
    }
 
    public void autoSave() {
        System.out.println("작업파일이 자동저장되었습니다 는 거짓부렁");
    }
}
 
 
 
 
cs

 

실행결과
1
2
3
4
5
작업파일이 자동저장되었습니다 는 거짓부렁
6
7
8
작업파일이 자동저장되었습니다 는 거짓부렁
9
10

 

 

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
52
53
54
55
56
57
58
59
package kr.co.threadtest;
 
import java.util.Iterator;
import java.util.Map;
 
public class ThreadEx11 {
 
    public static void main(String[] args) {
        ThreadEx11_1 t1= new ThreadEx11_1("Thread1");
        ThreadEx11_2 t2= new ThreadEx11_2("Thread2");
        
        t1.start();
        t2.start();
 
    }
 
}
 
class ThreadEx11_1 extends Thread{
    public ThreadEx11_1(String name) {
        super(name);
    }
    @Override
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            //e.printStackTrace();
        }
    }
}
class ThreadEx11_2 extends Thread{
    public ThreadEx11_2(String name) {
        super(name);
    }
    @Override
    public void run() {
        Map map = getAllStackTraces(); // 작업이 완료되지 않은 모든 쓰레드의 호출 스택 출력
        Iterator it = map.keySet().iterator();
        
        int x=0;
        while(it.hasNext()) {
            Object obj = it.next();
            Thread t = (Thread)obj;
            StackTraceElement[] ste = (StackTraceElement[])(map.get(obj));
            System.out.println("["+ +++"] name : " + t.getName()
            + ", group" + t.getThreadGroup().getName()
            + ", damon" + t.isDaemon());
            
            for(int i=0; i< ste.length; i++) {
                System.out.println(ste[i]);
            }
            System.out.println();
        }
    }
    
    
}
 
cs

 

 

 

728x90