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());