본문 바로가기
JAVA

[JAVA] 데몬 스레드 알아보기(특징, 사용 방법)

by 정공자씨 2024. 4. 30.

 

 

데몬 스레드(Daemon Thread)

개념

  • 자바는 일반적으로 여러 개의 스레드가 동시에 실행되면서 기능을 수행하는 멀티 스레드로 동작함
  • 이때 스레드들 중에 메인 스레드(Main Thread)가 종료하면 함께 종료되는 스레드가 있음
  • 이런 스레드를 데몬 스레드(Daemon Thread)라고 함
  • 대표적인 데몬 스레드로는 가비지 컬렉터, 워드프로세서의 자동 저장, 화면 자동 갱신 등이 있음
동영상 플레이어를 실행하면 → 동영상 실행 스레드와 자막 실행 스레드가 같이 실행 되는데
동영상 플레이어를 종료하면 → 동영상 실행 스레드와 자막 스레드가 같이 종료

 

 

 

특징

  • 일반 스레드(데몬 스레드가 아닌 스레드)의 작업을 돕는 보조적인 역할을 수행
  • 일반 스레드가 모두 종료되면, 데몬 스레드는 강제적으로 종료됨
  • 데몬 스레드를 생성하기 위해서는
    • 일반 스레드를 생성한 후에
    • setDaemon(true)를 호출하여 데몬 스레드를 생성
[ 주의 사항 ]
setDaemon() 메서드를 사용하여 데몬 스레드를 생성하는데, 이 코드는 반드시 start() 메서드 호출 이전에 작성

 

 

 

데몬 스레드를 생성하는 방법

// 일반 스레드 생성 후
Thread thread = new UserThread();

// Thread 클래스의 setDaemon() 메서드 = true
// 일반 스레드가 데몬 스레드가 됨
thread.setDaemon(true)

// 먄약 설정하지 않으면, false로 설정되어 일반 스레드로 동작
thread.setDaemon(false)

// 데몬 스레드 실행
thread.start();
  • 일반 스레드를 생성한 후에
  • Thread 클래스타입 참조변수(thread)와 setDaemon() 메서드를 사용하여 데몬 스레드를 생성하고
  • 데몬 스레드를 실행하기 위해서 start() 메서드를 사용
반드시 start() 메서드 호출 이전에 데몬 스레드 생성하기

 

 

 

[ 예제 ]  데몬 스레스 생성하여 사용하기 

1. 데몬 스레드를 설정하기 전

  • 일반 스레드로 설정하여 사용하기 
  • thread.setDaemon(false)
class Horse extends Thread {
    private int horseNum;

    public Horse(int horseNum) {
        this.horseNum = horseNum;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(200);  // 0.2초씩 딜레이 되어 출력
            } catch (InterruptedException e) {

            }			
            System.out.println(horseNum + "번 말이 " + 100*i + "미터 통과");
        }
        System.out.println(horseNum + "번 말이 결승선 도착");
    }
}
public class DemonTest {
    public static void main(String[] args) {

        Horse horse1 = new Horse(1);
        horse1.setDaemon(false);   // 일반 스레드로 설정

        // 메인 쓰레드와 horse 쓰레드가 순차적으로 실행
        horse1.start();  // 0.2초 후부터 실행

        System.out.println("메인 쓰레드");  // 바로 실행	
    }
}
      • setDaemon() 메서드로 horse  스레드를 false로 설정을 하면 
        • 프로그램 실행 시, 메인 스레드(Main Thread)가 종료되더라도 horse 스레드는 계속 작동함
      • 아래 코드를 실행한 후에  메인 스레드(Main Thread)는 종료가 됨
    • 하지만 Horse 스레드가 계속 동작하고 있어서, run() 메서드가 수행됨 
    • 이렇게 setDaemon() 메서드로 설정하지 않으면, 자동으로 false로 설정되어 Horse 쓰레드는 일반 스레드가 됨

[ 실행 결과 ]

 

 

2. 데몬 스레드를 설정한 후

  • thread.setDaemon(true)
class Horse extends Thread {
    private int horseNum;

    public Horse(int horseNum) {
        this.horseNum = horseNum;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(200);  // 0.2초씩 딜레이 되어 출력
            } catch (InterruptedException e) {

            }			
            System.out.println(horseNum + "번 말이 " + 100*i + "미터 통과");
        }
        System.out.println(horseNum + "번 말이 결승선 도착");
    }
}
public class Main {
    public static void main(String[] args) {

        Horse horse1 = new Horse(1);
        horse1.setDaemon(true);   // Horse 스레드를 데몬 스레드로 설정

        // 메인 스레드와 horse 스레드가 순차적으로 실행
        horse1.start();  // horse 스레드는 0.2초 후부터 실행하는데
                         // 메인 스레드 종료하면 함께 종료됨

        System.out.println("메인 쓰레드");  // 메인 스레드 바로 실행	
    }
}
  • setDaemon() 메서드로 horse 스레드를 true로 설정을 하면 데몬 스레드(Daemon Thread)가 되고
    • 이때 메인 스레드(Main Thread)가 종료되면 horse 스레드(Daemon Thread)도 함께 종료됨
  • 아래 코드를 실행한 후에 메인 스레드(Main Thread)는 종료가 됨
  • 데몬 스레드가 있는 경우, 메인 스레드가 종료하면 데몬 스레드도 함께 종료되는데
    • horse 스레드는 데몬 스레드이므로, 실행되지 않고 함께 종료됨
  • 따라서 메인 스레드가 바로 실행되고, horse 스레드는 0.2초 딜레이된 후에 실행되는데
    • 메인 메서드가 바로 실행 후 종료되었으므로
    • horse 스레드(데몬 스레드) 실행되지 못하고 함께 종료

[ 실행 결과 ]

 

 

3. 데몬 스레드를 설정하기 전

class Horse extends Thread {
    private int horseNum;

    public Horse(int horseNum) {
        this.horseNum = horseNum;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(200);  // 0.2초씩 딜레이 되어 출력
            } catch (InterruptedException e) {

            }			
            System.out.println(horseNum + "번 말이 " + 100*i + "미터 통과");
        }
        System.out.println(horseNum + "번 말이 결승선 도착");
    }
}
public class DemonTest {
    public static void main(String[] args) {

        Horse horse1 = new Horse(1);
        horse1.setDaemon(false);   // 일반 스레드로 설정
                                   // 메인 쓰레드가 종료되더라도 horse 쓰레드 동작		

        // 메인 쓰레드와 horse 쓰레드 동시 실행
        horse1.start();  // horse 쓰레드: 0.2초씩 딜레이

        try {
            Thread.sleep(1000);  // 메인 쓰레드: 1초 딜레이
        } catch (InterruptedException e) {

        }		
        System.out.println("메인 쓰레드");   // 메인 쓰레드 1초 후에 출력		
    }
}
  • horse 스레드가 0.2초씩 딜레이되며 실행
  • 메인 스레드(Main Thread)가 1초 딜레이 후에 실행되고 종료됨 
  • 메인 스레드가 종료 되었어도, horse 스레드는 일반 스레드라서 종료되지 않았으므로
    • run() 메서드의 for문을 계속 수행함

[ 실행 결과 ]