본문 바로가기
JAVA

[JAVA] 데몬 스레드

by happenstance 2021. 7. 30.

데몬 스레드(daemon thread)

- 일반 스레드의 작업을 돕는 보조적인 역할을 수행한다.

- 일반 스레드가 모두 종료되면 자동적으로 종료된다.

- 가비지 컬렉터, 자동저장, 화면자동갱신 등에 사용된다.

- 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.

 

✔ boolean isDaemon()

   - 스레드가 데몬 스레드인지 확인한다. 데몬 스레드이면 true를 반환한다.
✔ void setDaemon(boolean on)

   - 스레드를 데몬 스레드로 또는 사용자 스레드로 변경한다.

   - 매개변수 on의 값을 true로 지정하면 데몬 스레드가 된다.

   - setDaemon(boolean on)은 반드시 start()를 호출하기 전에 실행되어야 한다.

     그렇지 않으면 IllegalThreadStateException이 발생한다.

 

🌳 데몬 스레드를 사용하지 않았을 때

public class ThreadTest06 {

	public static void main(String[] args) {
		AutoSaveThread autoSave = new AutoSaveThread();

		autoSave.start();

		try {
			for (int i = 1; i <= 20; i++) {
				System.out.println(i);
				Thread.sleep(1000);
			}
		} catch (InterruptedException e) {

		}
		System.out.println("main 스레드 종료");
	}

}

// 자동 저장하는 스레드 (3초에 한 번씩 자동 저장하는 스레드)
class AutoSaveThread extends Thread {
	// 작업 내용을 저장하는 메소드
	public void save() {
		System.out.println("작업 내용을 저장합니다.");
	}

	@Override
	public void run() {
		while (true) {
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {

			}
			save();
		}
	}
}
//실행 결과
//1
//2
//3
//작업 내용을 저장합니다.
//4
//5
//6
//작업 내용을 저장합니다.
//7
//8
//9
//작업 내용을 저장합니다.
//10
//11
//12
//작업 내용을 저장합니다.
//13
//14
//15
//작업 내용을 저장합니다.
//16
//17
//18
//작업 내용을 저장합니다.
//19
//20
//main 스레드 종료
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.
//작업 내용을 저장합니다.

   - 메인 메소드가 종료되었으나  자동 저장 스레드는 종료되지 않았기 때문에 자동 저장 스레드가 무한 반복된다.

 

🌳 데몬 스레드를 사용하였을 때

public class ThreadTest06 {

	public static void main(String[] args) {
		AutoSaveThread autoSave = new AutoSaveThread();
		// 데몬 스레드로 설정하기
		// 반드시 start() 메소드 호출 전에 설정한다.
		autoSave.setDaemon(true); 
		
		autoSave.start();

		try {
			for (int i = 1; i <= 20; i++) {
				System.out.println(i);
				Thread.sleep(1000);
			}
		} catch (InterruptedException e) {

		}
		System.out.println("main 스레드 종료");
	}

}
//실행결과
//1
//2
//3
//작업 내용을 저장합니다.
//4
//5
//6
//작업 내용을 저장합니다.
//7
//8
//9
//작업 내용을 저장합니다.
//10
//11
//12
//작업 내용을 저장합니다.
//13
//14
//15
//작업 내용을 저장합니다.
//16
//17
//18
//작업 내용을 저장합니다.
//19
//20
//main 스레드 종료

   - 자동 저장 스레드를 데몬 스레드로 설정하였기 때문에 일반 스레드가 모두 종료되면 자동적으로 종료된다.