자바의 정석 12장 (33일차) - 데몬쓰레드 & 쓰레드 실행과정

728x90

데몬쓰레드 - Daemon thread

데몬쓰레드란 메인쓰레드 옆에서 보조를 담당하는 쓰레드이다.

  • 보조쓰레드이기 때문에 항시 옆에서 동작하다가 메인쓰레드가 종료되면 같이 종료된다.
  • 예시로 워드의 자동저장이나 GC가 있다.

 

데몬쓰레드 선언

 

아래의 코드처럼 데몬쓰레드를 선언할 때는 아래의 사항을 고려해야한다.

  • setDaemon을 사용하여 데몬쓰레드를 생성하고 start전에 실행해줘야 데몬쓰레드로 적용된다. 
  • 데몬쓰레드는 항시 동작하고 메인쓰레드가 종료되면 동시에 종료되기 때문에 무한반복문으로 생성한다.

아래의 코드 순서:

  1. 쓰레드를 runnaable로 받아온 후에 Thread 클래스로 할당한다.
  2. 받은 쓰레드를 setDaemon으로 데몬쓰레드로 정의한 후에 만든 데몬쓰레드를 실행한다.
  3. 데몬쓰레드가 실행됨가 동시에 메인쓰레드로 이동하여 for문을 반복한다. 
  4. for문이 1초마다 i의 변수를 실행하고 i가 2가 될 때 데몬쓰레드의 변수인 isStock을 true로 변환한다.
  5. isStock이 true이기 때문에 항시 동작되고 있던 데몬쓰레드의 코드인 purchase()메서드가 조건이 충족된다. 
  6. 충족된 조건을 3초마다 실행하여 화면에 출력하고 메인쓰레드의 for문이 종료되면 동시에 종료된다.
public class DaemonPractice {
	public static void main(String[] args) {
		Runnable r = new DtHread();
		Thread t = new Thread(r);
		DtHread d = (DtHread)r;
		
		t.setDaemon(true); //데몬쓰레드는 쓰레드의 실행인 start전에 실행해줘야한다.
		t.start();
		
		for(int i = 1; i<10; i++) {
			try {
				Thread.sleep(1000);
				System.out.println(i);
			}
			catch (InterruptedException e) {
			}
			if(i == 2) {
				d.isStock = true;
				
			}
		}
	}
}

class DtHread implements Runnable{
	boolean isStock = false;
	
	@Override
	public void run() {
		while(true){ // 무한반복문을 사용해 데몬쓰레드 지정
			try {
				Thread.sleep(3 * 1000);
			} catch (Exception e) {
				}
			if(isStock) {
				purchase();
			}
		}
	}
	public void purchase() {
		System.out.println("매수 완료");
	}
}

쓰레드의 실행과정

쓰레드는 대표적으로 3가지 과정으로 실행된다. 

  • new - 새롭게 시작됨
  • runnable - 실행되기 위하여 기다리는 중
  • terminated - 실행 후에 종료

runnable의 과정에 쓰레드의 실행에 관여(방해)하는 메서드들이 존재하는데 그 메서드들은 아래와 같다.

  • suspended() - 일시정지
  • wait() - 다른 쓰레드가 종료될때까지 기다림
  • join() - 다른 쓰레드대신 먼저 실행됨 (본인 것 부터 실행!)
  • sleep() - 쓰레드를 잠시 중지

방해과정들을 물리치는? 대비적 메서드는 아래와 같다.

resume() - suspended되어진 쓰레드를 다시 진행

notify() - wait되어진 쓰레드를 다시 동작시킴

interrupt() - join()이나 sleep(),즉 자고있는 쓰레드를 강제 기상시켜 동작시킴


쓰레드 실행제어 메서드

위의 실행과정 메서드를 자세하게 나열해 놓았다.

  • yield: 본인의 실행하고 있던 일을 내려놓고 다른 쓰레드에게 작업 시간 양도

아래의 sleep과 yield에만 static이 있다. 즉, sleep과 yield 메서드는 본인의 쓰레드에만 선언이 가능하다는 의미이다.

728x90