java/Thread

[Thread] Daemon Thread

잘할수있을거야 2021. 5. 27. 22:03

데몬 스레드는 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드

일반 스레드가 모두 종료되면 데몬 스레드는 자동 종료된다. 일반 스레드의 보조역할을 수행하므로 일반 스레드가 없으면 존재의미가 없기 때문이다.

 

데몬 스레드- 가비지 컬렉터, 워드프로세서의 자동저장, 화면자동갱신 등이 있다.

 

데몬 스레드는 일반 스레드의 작성방법과 실행방법이 같으며 스레드를 생성한 후 실행전에 setDaemon(true)를 호출하기만 하면 된다. 

 

데몬 스레드가 생성한 스레드는 자동적으로 데몬 스레드가 된다.

 

스레드가 데몬 스레드인지 일반 스레드인지 확인하는 메서드 스레드참조변수.isDaemon() -> boolean리턴


데몬 스레드는 무한루프와 조건문을 이용하여 실행 후 대기하고 있다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.

 

public class DaemonThreadTest implements Runnable  {
	static boolean autoSave = false;

	public static void main(String[] args) {
		Thread t = new Thread(new DaemonThreadTest());
        
		t.setDaemon(true); 
        // 이 부분이 없으면 메인 스레드가 종료되어도 이 스레드는 종료되지 않는다.
        
		t.start();

		for(int i=1; i <= 10; i++) {
			try{
				Thread.sleep(1000);
			} catch(InterruptedException e) {}
			System.out.println(i);
			
			if(i==5)
				autoSave = true;
		}

		System.out.println("프로그램을 종료합니다.");
	}

	public void run() {
		while(true) {
			try { 
				Thread.sleep(3 * 1000);	// 3초마다
			} catch(InterruptedException e) {}	
				
			if(autoSave) { //// autoSave의 값이 true이면 autoSave()를 호출한다.
				autoSave();
			}
		}
	}

	public void autoSave() {
		System.out.println("작업파일이 자동저장되었습니다.");
	}
}

결과

1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
프로그램을 종료합니다.


isDaemon(true)를 설정하지 않으면 10초가 지나도 메인스레드는 종료되었지만(프로그램을 종료합니다)

생성한 스레드 t는 영원히 돌게 된다.

 

1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
프로그램을 종료합니다.
작업파일이 자동저장되었습니다. //종료되지 않은 우리가 돌리고 있는 스레드
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.
작업파일이 자동저장되었습니다.


setDaemon()메서드는 start()를 호출하기 전에 실행되어야 한다. 그렇지 않으면 IllegalThreadStateException이 발생한다.