데몬 스레드와 데몬 스레드 그룹
일반적으로, 스레드는 자신의 작업을 수행하도록 되어 있는 반면,
데몬 스레드란 다른 스레드로부터 요청을 받아 특정 서비스를 수행하는 작업을 합니다.
따라서, 데몬 스레드 자신이 맡고 있는 서비스에 대한 요청이 언제 발생하더라고 모두 수행해 주어야 합니다.
이를 위해, 데몬 스레드의 몸체는 보통 무한루프를 돌도록 되어 있고,
시스템이 살아있는 동안 계속 그 시스템과 생명주기를 같이 하도록 되어 있습니다.
그리고, 자바에서는 다른 일반 스레드가 모두 종료되고 데몬 스레드만 남아 있다면,
해당 프로그램을 자동으로 종료하도록 하고 있습니다.
왜냐하면, 데몬 스레드는 다른 스레드를 돕는 역할을 하는데 다른 스레드가 하나도 남아있지 않다면,
데몬 스레드의 존재 가치가 더 이상 필요 없기 때문입니다.
마지막으로, 데몬 스레드가 생성한 스레드는 디폴트로 데몬 스레드가 됩니다.
이러한, 데몬 스레드를 위해 Thread 클래스에서 제공해 주고 있는 메소드를 살펴보면, 다음과 같습니다.
/**
* 이 스레드를 데몬 스레드 또는 사용자 스레드로 설정합니다.
* 현재, 수행되고 있는 모든 스레드가 데몬 스레드이면 자바 가상머신은 수행을 마치게 되며,
* 이 메소드는 반드시 스레드가 시작(start)하기 전에 호출되어야 합니다.
*/
-
public final void setDaemon(boolean daemon);
/**
* 스레드가 데몬 스레드인지 얻습니다.
* 데몬 스레드 그룹은 자신이 포함하고 있는 멤버가 다 종료되면 자동으로 종료됩니다.
* 데몬 스레드의 경우와 마찬가지로, 데몬 스레드 그룹의 자식 스레드 그룹은 디폴트로 데몬 스레드 그룹이 됩니다.
*/
-
public final boolean isDaemon():
다음에 나오는 자바 프로그램은 데몬 스레드와 데몬 스레드 그룹에 대한 간단한 예를 보여주는 프로그램입니다.
import java.lang.*;
class DaemonThread extends Thread{
public void run(){
while(true){
System.out.println(getName() + ": Polling...");
try {
sleep(100);
}catch(InterruptedException e){ }
}
}
}
class DaemonThreadTest{
public static void main(String args[] ){
Thread t1 = new DaemonThread();
Thread t2 = new DaemonThread();
// (a)
t1.setDaemon(true);
t1.start();
t2.setDaemon(true);
t2.start();
// (b)
// t1.setDaemon(true);
// t2.setDaemon(true);
try{
Thread.sleep(1000);
}catch(InterruptedException e){ }
}
}
/* * Results: (a) 부분을 주석처리한 후, 실행시킨 경우
D:AIITJAVA\6>java DaemonThreadTest
Thread-0:Polling...
Thread-1:Polling... ... ...
^C 무한루프
D:AIITJAVA\6>
(b) 부분을 주석처리한 후, 실행시킨 경우
D:AIITJAVA\6>java DaemonThreadTest
Thread-0: Polling...
Thread-1: Polling... ...
D:AIITJAVA\6> |
setDaemon 메소드는 스레드가 시작하기 전에 호출되어야 데몬 스레드 또는 데몬 스레드 그룹으로 설정할 수 있습니다.
위의 (a) 부분만 주석처리하고 실행시키거나, (b) 부분만 주석처리하고 실행시켜 보면, 그 차이를 알 수 있습니다.