JAVA

[Thread] 데몬 스레드, 스레드의 상태

ewok 2023. 2. 26. 17:23

데몬 스레드(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("작업파일이 자동저장되었습니다.");
    }
}

 

 

스레드의 상태

 

  1. 스레드를 생성하고 start()를 호출하면 바로 실행되는 것이 아니라 실행 대기열에 저장되어 차례를 기다린다. 대기열은 큐(queue)와 같은 구조로 먼저 대기열에 들어온 스레드가 먼저 실행된다.
  2. 실행 대기 상태에 있다가 자신의 차례가 되면 실행상태가 된다.
  3. 주어진 실행시간이 다되거나 yield()를 만나면 다시 실행 대기 상태가 되고 다음 차례의 스레드가 실행 상태가 된다.
  4. 실행 중 suspend(), wait(), join(), I/O block에 의해 일시정지 상태가 될 수 있다. I/O block은 입출력 작업에서 발생하는 지연상태이다.
  5. 지정된 일시정지 시간이 다 되거나(time-out), notify(), resume(), interrupt()가 호출되면 일시정지 상태를 벗어나 다시 실행대기열에 저장되어 차례를 기다린다.
  6. 실행을 모두 마치거나 stop()이 호출되면 스레드는 소멸된다.

 

스레드의 실행 제어

  • 스레드의 실행을 제어할 수 있는 메서드가 제공된다.
  • 이들을 활용해서 보다 효율적은 프로그램을 작성할 수 있다.

sleep(), yield()는 스레드 자기 자신에게만 호출이 가능하다. 다시 말해 다른 스레드에게 적용할 수 없다.

댓글수0