Notice
Recent Posts
Recent Comments
«   2024/09   »
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
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

데몬 쓰레드(daemon thread), 쓰레드의 상태 본문

Java/JAVA3

데몬 쓰레드(daemon thread), 쓰레드의 상태

빌드이너프 2023. 8. 3. 19:46

데몬 쓰레드

일반 쓰레드(non-daemon thread)의 작업을 돕는 보조적인 역할을 수행

일반 쓰레드가 모두 종료되면 자동적으로 종료된다

가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다

무한 루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다

(무한 루프이더라도 일반 쓰레드가 모두 종료되면 자동적으로 종료된다)

public void run() {
    while(true) { // 무한루프
        Thread.sleep(3 * 1000); // 3초마다
    } catch(InterruptedException e) {}
    
    // autoSave의 값이 true이면 autoSave()를 호출한다
    if(autoSave) {
        autoSave();
    }
}

 

일반 쓰레드 -> 데몬 쓰레드 or 사용자 쓰레드

*setDaemon(boolean on)은 반드시 start()를 호출하기 전에 실행되어야 한다(그렇지 않으면  IllegalThreadStateException이 발생한다)

// 쓰레드가 데몬 쓰레드인지 확인, 데몬 쓰레드이면 true 반환
boolean isDaemon()

// 쓰레드를 데몬 쓰레드로 또는 사용자 쓰레드로 변경, 매개변수 on을 true로 지정하면 데몬 쓰레드가 된다
void setDaemon(boolean on)

 

코드

쓰레드 생성 방법 중 2번째 실행(② Runnable 인터페이스를 구현)

만약 데몬 쓰레드가 아니라면 무한루프 발생

class DeamonThreadTest implements Runnable  {
    static boolean autoSave = false;

    public static void main(String[] args) {
        Thread t = new Thread(new DeamonThreadTest()); // Thread(Runnable r)
        t.setDaemon(true);		// 이 부분이 없으면 종료되지 않는다, 데몬 메서드를 만든다, start()보다 먼저 실행되어야 한다
        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("작업파일이 자동저장되었습니다.");
    }
}


1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
프로그램을 종료합니다.

 

 

 


쓰레드의 상태

상태 설명
NEW 쓰레드가 생성되고, 아직 start()가 호출되지 않은 상태
RUNNABLE 실행 중 또는 실행 가능한 상태
BLOCKED 동기화 블럭에 의해서 일시정지된 상태(lock이 풀릴 때까지 기다리는 상태)
WAITING, TIMED_WAITING 쓰레드의 작업이 종료되지는 않았지만, 실행가능하지 않은(unrunnable) 일시정지상태
TIMED_WAITING은 일시정지 시간이 지정된 경우를 의미
TERMINATED 쓰레드의 작업이 종료된 상태


 

쓰레드의 실행제어

쓰레드의 실행을 제어할 수 있는 메서드가 제공된다

static 붙은 것: 쓰레드 자기 자신한테만 호출가능

메서드 설명
static void sleep(long millis)
static void sleep(long millis, int nanos)
지정된 시간(천 분의 일 초 단위)동안 쓰레드를 일시정지시킨다
지정한 시간이 지나고 나면, 자동적으로 다시 실행대기상태가 된다
void join()
void join(long millis)
void join(long millis, int nanos)
지정된 시간동안 쓰레드가 실행되도록 한다
지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속한다
void interrupt() sleep()이나 join()에 의해 일시정지 상태인 쓰레드를 깨워서 실행대기 상태로 만든다
해당 쓰레드에서는 Interrupted Exception이 발생함으로써 일시정지 상태를 벗어나게 된다
void stop() 쓰레드를 즉시 종료시킨다
void suspend() 쓰레드를 일시정지시킨다
resume()을 호출하면 다시 실행대기 상태가 된다
void resume() suspend()에 의해 일시정지 상태에 있는 쓰레드를 실행대기 상태로 만든다
static void yield() 실행 중에 자기 자신에게 주어진 실행 시간을 다른 쓰레드에게 양보(yield)하고 자신은 실행대기 상태가 된다

'Java > JAVA3' 카테고리의 다른 글

suspend(), resume(), stop()  (0) 2023.08.07
sleep(), interrupt()  (0) 2023.08.04
쓰레드의 우선순위, 쓰레드 그룹  (0) 2023.08.03
싱글 쓰레드와 멀티 쓰레드, 쓰레드의 I/O 블락킹(blocking)  (0) 2023.08.03
main 쓰레드  (0) 2023.08.03