[Day 15 | Java] 스레드의 종류: 일반 스레드와 데몬 스레드

y♡ding·2024년 11월 1일
0

데브코스 TIL

목록 보기
101/163

Java에서는 스레드를 크게 두 종류로 나눌 수 있습니다: 일반 스레드데몬 스레드. 이 두 스레드의 가장 큰 차이점은 메인 스레드가 종료되었을 때의 동작 방식입니다.


1. 일반 스레드 (Non-Daemon Thread)

  • 특징:
    • 일반 스레드는 프로그램이 종료되기 전에 반드시 완료되어야 합니다.
    • 메인 스레드가 종료되더라도 모든 일반 스레드가 작업을 끝낼 때까지 프로그램은 종료되지 않고 대기합니다.
    • 일반 스레드는 메인 작업과 관련이 있는 중요한 작업을 수행할 때 주로 사용됩니다.

2. 데몬 스레드 (Daemon Thread)

  • 특징:
    • 데몬 스레드는 백그라운드에서 보조 작업을 수행하는 스레드입니다.
    • 메인 스레드가 종료되면 데몬 스레드는 자동으로 종료됩니다. 즉, 메인 스레드와 일반 스레드가 모두 종료되면 프로그램과 함께 데몬 스레드도 종료됩니다.
    • setDaemon(true) 메서드를 호출해 스레드를 데몬으로 설정할 수 있습니다.
    • 주로 주 작업을 돕는 백그라운드 작업 (예: 로그 기록, 가비지 수집) 등에 사용됩니다.

예제 코드

이 예제에서는 자동 저장 기능을 데몬 스레드로, 주 작업을 일반 스레드로 구현했습니다. 데몬 스레드는 메인 스레드가 종료되면 함께 종료되지만, 일반 스레드는 프로그램이 작업을 완료할 때까지 실행됩니다.

// AutoSave.java (데몬 스레드 역할)
class AutoSave extends Thread {
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000); // 1초마다 자동 저장
                System.out.println("자동 저장 중...");
            } catch (InterruptedException e) {
                System.out.println("AutoSave interrupted");
                break;
            }
        }
    }
}

// MainTask.java (일반 스레드 역할)
class MainTask extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) { // 주요 작업을 5번 반복
            System.out.println("주 작업 실행 중: " + i);
            try {
                Thread.sleep(1500); // 1.5초 대기
            } catch (InterruptedException e) {
                System.out.println("MainTask interrupted");
            }
        }
        System.out.println("주 작업 완료!");
    }
}

// Main.java (메인 클래스)
public class Main {
    public static void main(String[] args) {
        AutoSave autoSave = new AutoSave();
        autoSave.setDaemon(true); // AutoSave를 데몬 스레드로 설정
        autoSave.start();

        MainTask mainTask = new MainTask();
        mainTask.start(); // MainTask는 일반 스레드로 실행
    }
}

코드 설명

  1. AutoSave (데몬 스레드):

    • AutoSave 클래스는 run() 메서드에서 1초마다 "자동 저장 중..." 메시지를 출력합니다.
    • setDaemon(true)를 통해 데몬 스레드로 설정되어, 메인 스레드가 종료되면 AutoSave도 종료됩니다.
  2. MainTask (일반 스레드):

    • MainTask 클래스는 주 작업을 수행하며, 1.5초마다 "주 작업 실행 중" 메시지를 출력합니다.
    • 5번 반복한 후 "주 작업 완료!"를 출력하며 종료됩니다.
    • 일반 스레드이므로 메인 스레드가 종료되더라도 MainTask는 끝까지 실행됩니다.
  3. Main 클래스:

    • main 메서드에서 autoSavemainTask 스레드를 각각 실행합니다.

실행 결과

프로그램 실행 시 다음과 같은 결과가 예상됩니다.

자동 저장 중...
주 작업 실행 중: 1
자동 저장 중...
주 작업 실행 중: 2
자동 저장 중...
자동 저장 중...
주 작업 실행 중: 3
자동 저장 중...
자동 저장 중...
주 작업 실행 중: 4
자동 저장 중...
자동 저장 중...
주 작업 실행 중: 5
주 작업 완료!

이제 주 작업이 완료되면 프로그램이 종료되며, autoSave 스레드도 자동으로 종료됩니다.


수업 코드

아래의 코드에서는 Gugudan 클래스와 GugudanMain 클래스를 통해 두 개의 스레드를 생성하고 실행합니다.

package com.thread;

public class Gugudan extends Thread {

    private int dan;

    public Gugudan(int dan) {
        this.dan = dan;
    }

    @Override
    public void run() {
        System.out.println(this.getName() + " 시작");
        for (int i = 1; i < 300; i++) {
            System.out.printf("%s X %s = %s%n", dan, i, (dan * i));
        }
        System.out.println(this.getName() + " 끝");
    }
}

package com.thread;

public class GugudanMain {
    public static void main(String[] args) {

        Gugudan gugudan1 = new Gugudan(3);  // 3단 구구단 스레드
        Gugudan gugudan2 = new Gugudan(6);  // 6단 구구단 스레드

        System.out.println("시작");

        // 기본 우선순위 확인 후 우선순위 설정
        System.out.println(gugudan1.getPriority());  // 출력: 5
        System.out.println(gugudan2.getPriority());  // 출력: 5

        gugudan1.setPriority(1);  // gugudan1의 우선순위를 1로 설정 (낮음)
        gugudan2.setPriority(9);  // gugudan2의 우선순위를 9로 설정 (높음)

        gugudan1.setName("3단");  // gugudan1의 이름 설정
        gugudan2.setName("6단");  // gugudan2의 이름 설정

        // 스레드 시작
        gugudan1.start();
        gugudan2.start();

        System.out.println("끝");
    }
}
  • 코드 실행 순서:

    • gugudan1gugudan2 두 스레드를 생성하고 각각 start() 메서드를 호출하여 실행을 시작합니다.
    • gugudan1gugudan2는 각각 3단6단 구구단을 출력하는 작업을 수행합니다.
    • start() 메서드로 스레드를 실행하면서 메인 스레드는 System.out.println("끝")을 출력하고 종료되지만, 일반 스레드로 생성된 gugudan1gugudan2가 작업을 완료할 때까지 프로그램은 종료되지 않습니다.
  • 데몬 스레드로 설정하려면:

    gugudan1.setDaemon(true);
    gugudan2.setDaemon(true);

    위와 같이 설정하면 gugudan1gugudan2가 메인 스레드가 종료되면 자동으로 종료되는 데몬 스레드가 됩니다.


정리

이 코드에서는 gugudan1gugudan2가 일반 스레드이기 때문에, 메인 스레드가 종료된 후에도 두 스레드의 작업이 모두 끝날 때까지 프로그램이 실행됩니다. 반면, 데몬 스레드로 설정된 경우 메인 스레드가 종료되면 두 스레드 역시 바로 종료됩니다.

0개의 댓글

관련 채용 정보