[Java][Thread] 데몬 쓰레드(daemon thread)

2022. 6. 30. 13:19JAVA/Language

1. 데몬 쓰레드는 무엇인가?

데몬 쓰레드는 다른 일반 쓰레드(데몬 쓰레드가 아닌 쓰레드)의 작업을 돕는 보조적인 역할을 수행하는 쓰레드입니다. 일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료됩니다. 대표적인 데몬 쓰레드로는 가비지 컬렉터, 워드프로세서의 자동저장, 화면 자동갱신 등이 존재합니다.

 

데몬 쓰레드의 특징

  • 일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 종료됨
  • 데몬 쓰레드는 무한루프와 조건문을 이용해서 실행후 대기하고 있다가 특정 조건이 만족되면 작업을 수행하고 다시 대기함
  • 데몬 쓰레드를 생성하기 위해서는 쓰레드를 생성한 다음 setDaemon(true)를 호출하여 생성함
  • 데몬 쓰레드가 생성한 쓰레드는 자동적으로 데몬 쓰레드가 됨

 

데몬 쓰레드 관련 메서드

boolean isDaemon() : 쓰레드가 데몬 쓰레드인지 확인합니다.
                     데몬쓰레드이면 true를 반환

void    setDaemon(boolean on) : 쓰레드를 데몬 쓰레드 또는 사용자 쓰레드로 변경합니다.
                                매개변수 on의 값을 true로 지정하면 데몬 쓰레드가 됩니다.

 

다음 예제는 3초마다 변수 autoSave의 값을 확인해서 그 값이 true이면 autoSave() 메서드를 호출하는 일을 무한히 반복하도록 쓰레드를 작성한 예제입니다.

public class MyThread implements Runnable{
	static boolean autoSave = false;
	
	
	@Override
	public void run() {
		while(true)
		{
			try {
				Thread.sleep(3*1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			if(autoSave)
			{
				autoSave();
			}
			
		}		
	}
	
	public void autoSave()
	{
		System.out.println("작업파일이 자동저장되었습니다.");
	}

}
public class Driver {

	public static void main(String[] args) {
		Thread t = new Thread(new MyThread());
		t.setDaemon(true);
		t.start();
		
		for(int i=1;i<=10;i++)
		{
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(i);
			if(i==5)
			{
				MyThread.autoSave = true;
			}
		}
	}

}
1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10

위 실행결과를 통해서 처음 실행 직후 5초가 지난후에는 3초마다 자동저장을 하는 것을 볼 수 있습니다. 만약 쓰레드 t가 데몬 쓰레드가 아니라면 이 프로그램은 강제종료하지 않는 한 영원히 종료되지 않을 것입니다.

 

References

source code : https://github.com/yonghwankim-dev/java_study/tree/main/ch13
[도서] Java의 정석, 남궁 성 지음