데몬 스레드에 대하여 알아보도록 하겠습니다.

 

일반적으로 데몬이라는 말은 리눅스나 유닉스등의 데몬 프로세스에서 많이 들어 보셨을 거라고 생각합니다.

ex) sshd, httpd - d는 daemon

 

daemon을 검색해보면 

멀티태스킹 운영체제에서 데몬은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다.

라고 설명이 나와있습니다.

※ 정의 출처 : 데몬 (컴퓨팅) - 위키백과, 우리 모두의 백과사전

 

데몬 (컴퓨팅) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 멀티태스킹 운영 체제에서 데몬(daemon, 발음: 데이먼/'deɪmən/ 또는 디먼 /'dimən/[1])은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 시스템 로그를 남기는 syslogd처럼 보통 데몬을 뜻하는 ‘d’를 이름 끝에 달고 있으며, 일반적으로 프로세스로 실행된다. 데몬은 대개 부모 프로세스를 갖지 않으며, 즉 PPID가 1이며, 따라서 프로세스 트리에서 i

ko.wikipedia.org

그런데 자바의 데몬 스레드의 정의는 다음과 같이 명시 되어 있습니다(이것이 자바다 기준)

 

데몬(daemon) 스레드는 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이다.

 

처음 데몬 정의에 나와있던 것을 바탕으로 생각해보면 데몬이라는 것은 syslogd 처럼 운영체제의 시스템 로그를 기록하는 작업을 돕는 역할을 수행하는 프로세스라고 생각할 수 있습니다.

 

마찬가지로 자바로 데몬 스레드도  프로그래밍을 해주면 우리가 일반적으로 알고 있는 데몬 프로세스처럼 사용할 수 있습니다.

 


데몬 스레드의 정의를 조금 더 알아보도록 하겠습니다.

 

1. 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드

2. 주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료된다.(주 스레드의 보조 역할을 수행하므로 주 스레드가 종료되면 데몬 스레드의 존재 의미가 없어지기 때문)

 

이 2가지를 제외하면 데몬 스레드는 일반 스레드와 크게 차이가 없습니다.

 

데몬 스레드의 적용 예

 

1. 워드프로세서의 자동 저장

2. 미디어 플레이어의 동영상 및 음악 재생

 

등이 있는데, 이 기능들은 주 스레드(워드프로세스, 미디어 플레이어, JVM)가 종료되면 같이 종료됩니다.

 


데몬 스레드를 만들어 보도록 하겠습니다.

 

스레드를 데몬으로 만들기 위해서는 주 스레드가 데몬이 될 스레드의 setDaemon(true)를 호출해 주면 됩니다.

 

주의점은 스레드를 실행하는 start() 메소드가 호출되고 나서 setDaemon(true)를 호출하면 IllegalThreadStateException이 발생하기 때문에 start() 메소드 호출 전에 setDaemon(true)를 호출해야 합니다.

 

또한 현재 실행 중인 스레드가 데몬 스레드인지 아닌지를 구별하는 방법은 isDaemon() 메소드의 리턴값을 조사해보면 됩니다.

 

데몬 스레드일 경우 true를 리턴합니다.

 

 

예제를 통해 직접 확인해 보도록 하겠습니다.

 

 

 

 

 

AutoSaveThread.java - 1초 주기로 save() 메소드를 호출하는 데몬 스레드

package thread_state_control_4;
 
public class AutoSaveThread extends Thread {
 
    public void save() {
        System.out.println("작업 내용을 저장함.");
    }
    
    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                break;
            }
            save();
        }
    }
}

 

 

 

DaemonExample.java - 메인 스레드가 실행하는 코드

 

package thread_state_control_4;
 
public class DaemonExample {
 
    public static void main(String[] args) {
        AutoSaveThread autoSaveThread = new AutoSaveThread();
        autoSaveThread.setDaemon(true);        //    AutoSaveThread를 데몬 스레드로 만듬
        autoSaveThread.start();
        
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
        }
        
        System.out.println("메인 스레드 종료");
    }
}

 

 

이 예제를 실행하게 되면 다음과 같은 결과를 확인할 수 있습니다.

 

작업 내용을 저장함.

작업 내용을 저장함.

메인 스레드 종료

 

교재에서는 "작업 내용을 저장함." 이 3번 출력된 결과를 보였는데 저는 2번 출력 되었습니다.

 


※ 간단하게 알아 보았지만 추후 추가 할 예제 등이 있으면 추가 하도록 하겠습니다.

 

 

+ Recent posts