데몬 스레드(Daemon Thread)
개념
- 자바는 일반적으로 여러 개의 스레드가 동시에 실행되면서 기능을 수행하는 멀티 스레드로 동작함
- 이때 스레드들 중에 메인 스레드(Main Thread)가 종료하면 함께 종료되는 스레드가 있음
- 이런 스레드를 데몬 스레드(Daemon Thread)라고 함
- 대표적인 데몬 스레드로는 가비지 컬렉터, 워드프로세서의 자동 저장, 화면 자동 갱신 등이 있음
동영상 플레이어를 실행하면 → 동영상 실행 스레드와 자막 실행 스레드가 같이 실행 되는데
동영상 플레이어를 종료하면 → 동영상 실행 스레드와 자막 스레드가 같이 종료
특징
- 일반 스레드(데몬 스레드가 아닌 스레드)의 작업을 돕는 보조적인 역할을 수행
- 일반 스레드가 모두 종료되면, 데몬 스레드는 강제적으로 종료됨
- 데몬 스레드를 생성하기 위해서는
- 일반 스레드를 생성한 후에
- setDaemon(true)를 호출하여 데몬 스레드를 생성
[ 주의 사항 ]
setDaemon() 메서드를 사용하여 데몬 스레드를 생성하는데, 이 코드는 반드시 start() 메서드 호출 이전에 작성
데몬 스레드를 생성하는 방법
// 일반 스레드 생성 후
Thread thread = new UserThread();
// Thread 클래스의 setDaemon() 메서드 = true
// 일반 스레드가 데몬 스레드가 됨
thread.setDaemon(true)
// 먄약 설정하지 않으면, false로 설정되어 일반 스레드로 동작
thread.setDaemon(false)
// 데몬 스레드 실행
thread.start();
- 일반 스레드를 생성한 후에
- Thread 클래스타입 참조변수(thread)와 setDaemon() 메서드를 사용하여 데몬 스레드를 생성하고
- 데몬 스레드를 실행하기 위해서 start() 메서드를 사용
반드시 start() 메서드 호출 이전에 데몬 스레드 생성하기
[ 예제 ] 데몬 스레스 생성하여 사용하기
1. 데몬 스레드를 설정하기 전
- 일반 스레드로 설정하여 사용하기
- thread.setDaemon(false)
class Horse extends Thread {
private int horseNum;
public Horse(int horseNum) {
this.horseNum = horseNum;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(200); // 0.2초씩 딜레이 되어 출력
} catch (InterruptedException e) {
}
System.out.println(horseNum + "번 말이 " + 100*i + "미터 통과");
}
System.out.println(horseNum + "번 말이 결승선 도착");
}
}
public class DemonTest {
public static void main(String[] args) {
Horse horse1 = new Horse(1);
horse1.setDaemon(false); // 일반 스레드로 설정
// 메인 쓰레드와 horse 쓰레드가 순차적으로 실행
horse1.start(); // 0.2초 후부터 실행
System.out.println("메인 쓰레드"); // 바로 실행
}
}
- setDaemon() 메서드로 horse 스레드를 false로 설정을 하면
- 프로그램 실행 시, 메인 스레드(Main Thread)가 종료되더라도 horse 스레드는 계속 작동함
- 아래 코드를 실행한 후에 메인 스레드(Main Thread)는 종료가 됨
- 하지만 Horse 스레드가 계속 동작하고 있어서, run() 메서드가 수행됨
- 이렇게 setDaemon() 메서드로 설정하지 않으면, 자동으로 false로 설정되어 Horse 쓰레드는 일반 스레드가 됨
[ 실행 결과 ]
2. 데몬 스레드를 설정한 후
- thread.setDaemon(true)
class Horse extends Thread {
private int horseNum;
public Horse(int horseNum) {
this.horseNum = horseNum;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(200); // 0.2초씩 딜레이 되어 출력
} catch (InterruptedException e) {
}
System.out.println(horseNum + "번 말이 " + 100*i + "미터 통과");
}
System.out.println(horseNum + "번 말이 결승선 도착");
}
}
public class Main {
public static void main(String[] args) {
Horse horse1 = new Horse(1);
horse1.setDaemon(true); // Horse 스레드를 데몬 스레드로 설정
// 메인 스레드와 horse 스레드가 순차적으로 실행
horse1.start(); // horse 스레드는 0.2초 후부터 실행하는데
// 메인 스레드 종료하면 함께 종료됨
System.out.println("메인 쓰레드"); // 메인 스레드 바로 실행
}
}
- setDaemon() 메서드로 horse 스레드를 true로 설정을 하면 데몬 스레드(Daemon Thread)가 되고
- 이때 메인 스레드(Main Thread)가 종료되면 horse 스레드(Daemon Thread)도 함께 종료됨
- 아래 코드를 실행한 후에 메인 스레드(Main Thread)는 종료가 됨
- 데몬 스레드가 있는 경우, 메인 스레드가 종료하면 데몬 스레드도 함께 종료되는데
- horse 스레드는 데몬 스레드이므로, 실행되지 않고 함께 종료됨
- 따라서 메인 스레드가 바로 실행되고, horse 스레드는 0.2초 딜레이된 후에 실행되는데
- 메인 메서드가 바로 실행 후 종료되었으므로
- horse 스레드(데몬 스레드) 실행되지 못하고 함께 종료
[ 실행 결과 ]
3. 데몬 스레드를 설정하기 전
class Horse extends Thread {
private int horseNum;
public Horse(int horseNum) {
this.horseNum = horseNum;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(200); // 0.2초씩 딜레이 되어 출력
} catch (InterruptedException e) {
}
System.out.println(horseNum + "번 말이 " + 100*i + "미터 통과");
}
System.out.println(horseNum + "번 말이 결승선 도착");
}
}
public class DemonTest {
public static void main(String[] args) {
Horse horse1 = new Horse(1);
horse1.setDaemon(false); // 일반 스레드로 설정
// 메인 쓰레드가 종료되더라도 horse 쓰레드 동작
// 메인 쓰레드와 horse 쓰레드 동시 실행
horse1.start(); // horse 쓰레드: 0.2초씩 딜레이
try {
Thread.sleep(1000); // 메인 쓰레드: 1초 딜레이
} catch (InterruptedException e) {
}
System.out.println("메인 쓰레드"); // 메인 쓰레드 1초 후에 출력
}
}
- horse 스레드가 0.2초씩 딜레이되며 실행
- 메인 스레드(Main Thread)가 1초 딜레이 후에 실행되고 종료됨
- 메인 스레드가 종료 되었어도, horse 스레드는 일반 스레드라서 종료되지 않았으므로
- run() 메서드의 for문을 계속 수행함
[ 실행 결과 ]
'JAVA' 카테고리의 다른 글
[JAVA] 스트림이 동작할 때(생성, 중간 연산, 최종 연산) 사용하는 메서드 (0) | 2024.05.01 |
---|---|
[JAVA] 스트림 API(특징, 스트림의 동작 흐름, 컬랙션과의 차이) (1) | 2024.05.01 |
[JAVA] 람다 표현식이란? (특징, 사용 문법) (0) | 2024.04.30 |
[JAVA] 자바 스레드 생성(Thread, Runnable) (0) | 2024.04.29 |
[JAVA] 프로세스와 스레드, 시스템 발전 과정(멀티 프로그래밍, 멀티태스킹) (0) | 2024.04.29 |