[Java] 자바 데몬스레드에 대하여 알아보자! [Daemon Thread]

2021-01-08


데몬스레드는 쉽게 말해서 주스레드의 하위 스레드라고 할 수 있다. 즉 주스레드의 보조적인 역할을 수행하게 되며, 주스레드가 종료될 경우 데몬스레드도 같이 종료되게 된다.


바로 코드로 살펴보도록 하자. 우선  Thread를 상속받는 두개의 클래스를 만들어 주었으며, 내용은 아래와 같다.

package Demon;

public class Thread1 extends Thread {
	
	@Override
	public void run() {
		while(true) {
			System.out.println("Thread1 is Running . . .");
		}
	}
}

package Demon;

public class Thread2 extends Thread {
	
	@Override
	public void run() {
		for(int i = 0; i < 3; i++){
			System.out.println("Thread2 is Running . . .");
		}
	}
}

두 클래스의 차이점은 Thread1의 경우는 while문을 통해 무한히 반복되는 출력문 메서드를 가지고 있으며, Thread 2는 for문을 통해 3번 반복하는 출력문 메서드를 가지고 있다.


package Demon;

public class main {

	public static void main(String[] args) {
		Thread1 thread1 = new Thread1();
		Thread2 thread2 = new Thread2();	
		
		thread1.setDaemon(true);
		thread1.start();
		thread2.start();
	
	}

}

이제 메인클래스로 가서 실행을 해보도록 하자. 사전에 두클래스 모두 스레드 변수로 선언해 주었으며, 데몬스레드로 사용할 thread1의 경우는 setDaemon(true)를 통해 데몬스레드로 선언해 주었다. 여기서 중요한 점은 스레드 실행 후. 즉 start() 메서드 호출한 다음 데몬 스레드를 설정하면 아래와 같이 IllegalThreadStateException 예외가 발생하게 된다.

때문에 위와 같이 정상적으로 start() 메서드 전에 데몬스레드를 설정해 준 후 실행시켜 주면 콘솔 창에 아래와 같은 출력문을 얻을 수 있다. (컴퓨터 환경에 따라 출력문은 순서와 개수는 조금씩 다를 수 있다.)

여기서 중요한 점은 Thread1 의 경우 while문으로 인해 무한루프를 도는 스레드임에도 불구하고 데몬스레드로 설정이 되어 상위 스레드 Thread2의 for 문 출력문 3번이 반복되고 종료되면 Thread1도 같이 종료되는 것을 확인할 수 있다.


이러한 결과가 출력되는 이유는 모두 메인 스레드에 속해 있는 스레드이며, Thread2(여기서는 메인 스레드라고 생각하면 이해하기 쉬울듯)이 종료됨에 따라 그의 데몬스레드인 Thread1도 같이 종료되기 때문이다. 스레드 정보를 출력해보면 아래와 같다.

			System.out.println(thread1.currentThread().getThreadGroup());
			System.out.println(thread2.currentThread().getThreadGroup());