본문 바로가기
컴퓨터 언어/JAVA

[JAVA] 쓰레드(Thread) (3) - 데몬 쓰레드(Daemon Thread)

by 테크케찰 2020. 7. 2.

이번 포스트는 남궁 성님의 "Java의 정석"이란 책을 참고하여 작성하였습니다.

포스트 내용 중에 오류나 수정 사항이 있으면 댓글 남겨주시면 감사드리겠습니다.

 

오늘은 쓰레드에 관한 세 번째 포스트를 작성하려고 합니다.

지난 포스트는 아래 링크를 참고하시면 감사드리겠습니다.

 

https://eloquence-developers.tistory.com/9

 

[JAVA] 쓰레드(Thread) (1)

이번 포스트는 남궁 성님의 "Java의 정석"이란 책을 참고하여 작성하였습니다. 포스트 내용 중에 오류나 수정 사항이 있으면 댓글 남겨주시면 감사드리겠습니다. 1. 쓰레드란? 쓰레드는 프로세스�

eloquence-developers.tistory.com

https://eloquence-developers.tistory.com/10

 

[JAVA] 쓰레드(Thread) (1)

이번 포스트는 남궁 성님의 "Java의 정석"이란 책을 참고하여 작성하였습니다. 포스트 내용 중에 오류나 수정 사항이 있으면 댓글 남겨주시면 감사드리겠습니다. 1. 쓰레드란? 쓰레드는 프로세스�

eloquence-developers.tistory.com

 

1. 데몬 쓰레드란?

데몬 쓰레드란 어떠한 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 쓰레드입니다.

ㅂ데몬 쓰레드는 백그라운드에서 특별한 작업을 수행하는 데에 종종 쓰인다고 합니다. 

데몬 쓰레드의 가장 큰 특징 중 하나는 일반 쓰레드가 종료된 이후에는 데몬 쓰레드 역시 자동으로 종료된다는 점인데요, 이 점은 아래에 예시 코드에서 보다 자세히 살펴보겠습니다.

 

2. 데몬 쓰레드 선언

데몬 쓰레드는 일반 쓰레드 선언과 똑같이 선언해주시면 됩니다.

다만 한 가지 다른 점은 데몬 쓰레드를 실행하기 전에 setDaemon(true)를 호출해주시면 됩니다.

 

아래는 데몬 쓰레드를 사용한 예시입니다.

 

package package1;

public class Main implements Runnable {
	
	static boolean autoSave=false;
	
	public static void main(String args[]) {
		Thread thread=new Thread(new Main());
		thread.setDaemon(true); // 이 스레드르르 데몬 스레드로 설정
		thread.start();
		
		for(int i=0;i<10;i++){
            try {
            	Thread.sleep(1000);
            }catch(InterruptedException e) {}
            System.out.println(i);
            
            if(i==5) autoSave=true;
        }
		System.out.println("프로그램을 종료합니다."); 
	}
	
// 1초마다 작업파일을 자동저장
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			if(autoSave) autoSave();
			
		}
	}
	
	public void autoSave() {
		System.out.println("자동저장되었습니다.");
	}
}







 위 코드는 프로그램 시작 후 5초일 때부터 1초에 한 번씩 자동저장을 하는 프로그램입니다.

보시면 thread.setDaemon(true) 문장을 이용해서 이 쓰레드를 데몬 쓰레드로 지정해주었습니다.

이 문장으로 인해 쓰레드가 데몬 쓰레드가 되고, Main 쓰레드가 종료되었을 때 데몬 쓰레드 역시 종료되는 것입니다.

위 코드를 실행했을 때 결과는 아래와 같습니다.

0
1
2
3
4
5
6
자동저장되었습니다.
자동저장되었습니다.
7
자동저장되었습니다.
8
자동저장되었습니다.
9
프로그램을 종료합니다.

만약 setDaemon(true) 문장이 없다면 결과는 어떻게 될까요?

궁금해서 제가 직접해봤는데요, "프로그램을 종료합니다"라는 문장이 뜨기 전까지는 똑같은 결과가 나오지만 그 이후에는 쓰레드가 종료되지 않아 10초가 지난 이후에도 자동저장이 계속 진행되는 것을 확인할 수 있었습니다.

따라서 데몬 쓰레드가 일반 쓰레드가 종료되면 따라서 종료된다는 점을 확인할 수 있었고, 이로 인해 보조적으로 백그라운드 작업을 수행할 수 있다는 점을 깨달았습니다.