Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 사용자 스레드(User Thread)와 데몬 스레드(Daemon Thread)의 차이 완벽 정리

Java에서 스레드는 크게 사용자 스레드(User Thread)데몬 스레드(Daemon Thread) 두 가지로 나뉩니다. 데몬 스레드는 주로 사용자 스레드를 지원하는 백그라운드 서비스 작업을 수행하는 데 활용됩니다.

애플리케이션의 main() 메서드가 실행되는 메인 스레드는 대표적인 사용자 스레드(비데몬 스레드)입니다. JVM은 모든 사용자 스레드(비데몬 스레드)가 종료될 때까지 프로그램을 종료하지 않습니다. 반면, 남아 있는 스레드가 모두 데몬 스레드뿐이라면 JVM은 이들을 기다리지 않고 즉시 종료합니다.

사용자 스레드를 데몬 스레드로 변환하는 방법

사용자 스레드가 생성한 새로운 스레드를 데몬 스레드로 명시적으로 지정하려면 setDaemon(true) 메서드를 호출하면 됩니다. 단, 이 메서드는 반드시 start()가 호출되기 전에 실행해야 하며, 그렇지 않으면 IllegalThreadStateException이 발생합니다. 또한 특정 스레드가 데몬 스레드인지 확인하려면 isDaemon() 메서드를 사용하면 됩니다.

핵심 특징 요약

  • 사용자 스레드: 모든 사용자 스레드가 종료되어야 JVM이 종료됩니다.
  • 데몬 스레드: 백그라운드에서 보조 작업을 수행하며, 사용자 스레드가 모두 종료되면 함께 종료됩니다.
  • 대표적인 데몬 스레드 예시: 가비지 컬렉터(Garbage Collector) 등이 있습니다.

예제 코드

public class UserDaemonThreadTest extends Thread {
    public static void main(String args[]) {
        System.out.println("Thread name is : " + Thread.currentThread().getName());
        // 메인 스레드가 데몬 스레드인지 사용자 스레드인지 확인
        System.out.println("Is main thread daemon ? : " + Thread.currentThread().isDaemon());
        UserDaemonThreadTest t1 = new UserDaemonThreadTest();
        UserDaemonThreadTest t2 = new UserDaemonThreadTest();
        // t1(사용자 스레드)을 데몬 스레드로 변환
        t1.setDaemon(true);
        t1.start();
        t2.start();
    }
    public void run() {
        // 각 스레드가 데몬 스레드인지 확인
        if (Thread.currentThread().isDaemon()) {
            System.out.println(Thread.currentThread().getName() + " is a Daemon Thread");
        } else {
            System.out.println(Thread.currentThread().getName() + " is an User Thread");
        }
    }
}

실행 결과

Thread name is : main
Is main thread daemon ? : false
Thread-0 is a Daemon Thread
Thread-1 is an User Thread

위 실행 결과를 보면, 메인 스레드의 isDaemon() 반환값이 false로 출력되어 메인 스레드가 사용자 스레드임을 확인할 수 있습니다. 또한 setDaemon(true)를 호출한 t1은 "Thread-0 is a Daemon Thread"로 출력되어 데몬 스레드로 동작하고, 별도 설정을 하지 않은 t2는 "Thread-1 is an User Thread"로 출력되어 일반 사용자 스레드로 동작하는 것을 알 수 있습니다.