Java/객체지향

[객체지향][쓰레드/thread] - 데몬 쓰레드, 쓰레드의 상태

얄루몬 2022. 3. 1. 16:35

https://youtu.be/W0v3Gwx92hc?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[데몬 쓰레드(demon thread)]

  • 일반 쓰레드(non - daemon thread)의 작업을 돕는 보조적인 역할을 수행한다.
  • 일반 쓰레드가 모두 종료되면 자동적으로 종료된다.
  • 어떤 일을 할 때 데몬 쓰레드를 사용할까?
    • 가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다.
  • 무한 루프와 조건문을 이용해서 실행 후 대기하다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다. 
    • 무한루프는 자동 종료가 되는 것이기 때문에 무한루프로 작성해도 괜찮다. 
boolean isDaemon() //쓰레드가 데몬 쓰레드인지 확인한다. 데몬 쓰레드면 true 반환
void setDaemon(boolean on) //쓰레드를 데몬 쓰레드로 또는 사용자 쓰레드로 변경한다.
                           //매개변수 on을 true로 지정하면 데몬 쓰레드가 된다.
  • setDaemon(boolean on)은 반드시 start() 호출 전에 실행되어야 한다. 그렇지 않으면 IllegalThreadStateException이 발생한다.

 

 

[실습]

package javajungsuk;

public class Java13_7 implements Runnable{
	static boolean autoSave = false;
	
	public static void main(String[] args) {
		/*Runnable 인터페이스 구현으로 쓰레드를 사용하는데 
		* 이때 우리는 run()함수를 구현한 객체를 돌려주는 방식을 사용했다.
		*/
		Thread t = new Thread(new Java13_7()); //Thread(Runnable r)
		t.setDaemon(true); // start()보다 먼저 사용!!! 이부분이 없으면 종료 X
		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();
		
		}
	}
	
	public void autoSave() {
		System.out.println("작업 파일이 자동저장되었습니다.");
	}
}
  • 5초 이후부턴 autoSave 값이 true가 되고 자동 저장이 되는 것, 그리고 나선 3초마다 자동저장을 해준다.
  • 무한루프여도 데몬 쓰레드로 만들어서 main(일반 쓰레드)가 종료되고 나면 데몬 쓰레드도 종료가 된다.
    • setDaemon(true)
[출력 값]
1
2
3
4
5
작업 파일이 자동저장되었습니다.
6
7
8
작업 파일이 자동저장되었습니다.
9
10
프로그램을 종료합니다.

 

 

[쓰레드의 상태]

  • RUNNABLE
    • 실행 시작 했다고 바로 시작하는 것이 아니고 앞 뒤로 실행을 대기 줄서기를 해서 실행까지 기다렸다 실행되면 실행을 하다 끝나면 다시 첫 번째 줄로 돌아가서 줄을 서는 것이고 stop()을 하면 소멸을 한다.
  • 일시정지 되는 상태로 쓰레드가 이동함. (WAITING, BLOCKED)
    • suspend() - 일시정지
    • sleep() - 잠자기
    • wait() - 기다리는 것
    • join() - 다른 쓰레드 기다리는 것
    • I/O block - 입출력 대기

 

 

[쓰레드의 실행제어]

  • 쓰레드의 실행을 제어할 수 있는 메서드가 제공된다.