K-DigitalTraining 강의/1. Java

[4주차] 74. Thread, 일반쓰레드 종료시 같이 종료되도록 할 수 있는 데몬쓰레드(완성)

이대곤 2022. 6. 3. 14:18

* 데몬쓰레드란?

  데몬쓰레드는 일반쓰레드가 모두 종료되면 무한루프를 돌고 있더라도 강제적으로 자동 종료된다.

  일반 쓰레드의 작업을 돕는 쓰레드로 가비지 컬렉터, 워드프로세서의 자동저장, 화면자동 생신 등에 쓰인다.

  일반쓰레드를 데몬쓰레드로 지정하기 위해서는 쓰레드 객체.setDaemon(true)를 호출하면 된다.
  인자를 false로 변경하면 메인 쓰레드가 종료되어도 이 쓰레드가 살아있게 된다.
  보통 데몬쓰레드가 아닌 일반 쓰레드를 보조하는 역할을 수행하는데 사용된다.

코드

Test 클래스의 run() 메소드는 while문으로 무한루프를 돌고 있었는데 데몬쓰레드로 지정했더니 main 함수 종료시 같이 종료되었다. 반대의 경우가 궁금하다면 객체.setDaemon(true) 의 인자를 false로 수정하고 실행해봐라.

class Test extends Thread{
	
	@Override
	public void run() {
		while(true) {
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			if(Ex10_05_데몬스레드.autoSave) {
				autoSave();
			}
		}
	}
	
	public void autoSave() {
		System.out.println("작업화일이 자동저장되었습니다.");
	}
}

public class Ex10_05_데몬스레드 {
	
	public static boolean autoSave = false;

	public static void main(String[] args) {
		
		Test t = new Test();
		t.setDaemon(true); // 이걸 true로 해주지 않으면 주 main이 종료되어도 쓰레드가 종료되지 않음.
		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)
				autoSave = true;
		}
	}
}

실행결과

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