스레드는 사용자(user) 스레드와 데몬(daemon) 스레드 2가지 종류로 구분할 수있다.
사용자 스레드 (non-deamon 스레드)
- 프로그램의 주요 작업을 수행한다.
- 작업이 완료 될 때 까지 실행된다.
- 모든 user 스레드가 종류되면 JVM 도 종료된다.
데몬 스레드
- 백그라운에서 보조적인 작업을 수행한다.
- 모든 user 스레드가 종류되면 데몬 스레드는 자동으로 종료된다.
jvm 은 데몬 스레드의 실행 완료를 기다리지 않고 종료된다. 데몬 스레드가 아닌 모든 스레드가 종류되면, 자바 프로그램도 종료된다.
용어 - 데몬 : 그리스 신화에서 데몬은 신과 인간 사이의 중간적 존재로 , 보이지 않게 활동하며 일상적인 일들을 도왔다. 이런 의미로 컴퓨터 과학에서는 사용자에게 직접적으로 보이지않으면서 시스템의 백그라운에서 작업을 수행하는 것을 데몬 스레드, 데몬 프로세스라 한다. 예를 들어 사용하지 않는 파일이나 메모리를 정리하는 작업들이 있다.
package thread.start;
public class DeamonThreadMain {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + " : main() start");
DaemonThread daemonThread = new DaemonThread();
daemonThread.setDaemon(true);
daemonThread.start();
System.out.println(Thread.currentThread().getName() + " : main() end");
}
static class DaemonThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " : run() start");
try {
Thread.sleep(10000);// 10초간 실행
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + " : run() end");
}
}
}
daemonThread.setDaemon(true) : 데몬 스레드로 설정한다.
데몬 스레드 여부는 start() 실행 전에 결정해야 한다. 이후에는 변경되지 않는다.
기본 값이 false 이다. (user 스레드가 기본)
run() 메서드 안에서 Thread.sleep() 를 호출할 때 체크 예외인 InterruptedException 을 밖으로 던질 수 없고 반드시 잡아야 한다. run 메서드는 체크 예외를 밖으로 던질 수 없다.
실행결과 - setDaemon(true)
- setDaemon(true) 설정 시
- Thread-0 는 데몬스레드로 설정된다.
- 유일한 user 스레드인 main 스레드가 종료되면서 자바 프로그램도 종료된다.
- 따라서 run() end 가 출력되기전에 프로그램이 종료된다.
실행결과 - setDaemon(false)
- 실행결과 - setDaemon(false) 설정 시
- Thread-0 는 user 스레드로 설정된다.
- main 스레드가 종료되어도, user 스레드인 Thread-0 가 종료될 때까지 자바프로그램은 종료되지 않는다.
- 따라서 Thread-0 : run() end 가 출련된다.
- user 스레드인 main 스레드와 Thread-0 스레드가 모두 종료되면서 자바 프로그램도 종료된다.
'JAVA' 카테고리의 다른 글
[JAVA] 스레드 Join (0) | 2024.11.12 |
---|---|
[JAVA] Runnable 을 만드는 다양한 방법 (0) | 2024.11.11 |
[JAVA] 스레드란? run() start() 의 차이 (0) | 2024.11.11 |
[JAVA] String + 연산과 비효율성 StringBuilder의 해결 원리 (0) | 2024.11.10 |
[JAVA] 제네릭 (Generic) (0) | 2024.11.08 |