본문 바로가기

하../java

ch13 데몬 스레드, 스레드의 상태

대몬 스레드(daemon thread)

- 일반(non-demon-thread)의 작업을 돕는 보조적인 역할을 수행(스레드의 종류 : 일반,데몬)

- 일반 스레드가 모두 종료되면 자동적으로 종료된다.

- 가비지 컬렉터, 자동저장,화면 자동갱신 등에 사용된다.

- 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.

public void run()
 while(true){ //일반 스레드가 언제 작업을 마칠지 모르니 무한루프로 작성
  try{
   Thread.sleep(3*1000); //3초마다
  } catch(InterruptedException e){}
  //autoSave의 값이 true이면 autoSave()를 호출한다.
  if(autoSave){
   autoSave();
  }
 }
boolean isDaemon() - 스레드가 데몬 스레드인지 확인한다. 데몬 스레드이면 true를 반환
void setDaemon(boolean on) - 스레드를 데몬 스레드로 또는 사용자 스레드로 변경 
매개변수 on을 true로 지정하면 데몬 스레드가 된다.
* setDaemon(boolean on)은 반드시 start()를 호출하기 전에 실행되어야 한다.
그렇지 않으면 IllegalThreadStateException이 발생한다.
static boolean autoSave = false;

	public static void main(String[] args) {
		Thread t = new Thread(new Ex13_7()); //Thread(Runnable r) 
		//스레드 구현방법 Thread를 상속받거나 Runnable인터페이스를 구현 
		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("프로그램을 종료합니다.");
	} //main thread

	public void run() {
		while(true) { // 무한루프 
			try { 
				Thread.sleep(3 * 1000); // 3초마다 
			} catch(InterruptedException e) {}

			// autoSave의 값이 true이면 autoSave()를 호출.
			if(autoSave) autoSave();
		}
	} //daemon thread

	public void autoSave() {
		System.out.println("작업파일이 자동저장되었습니다.");
	}
}
출력값
1
2
3
4
5
작업파일이 자동저장되었습니다.
6
7
8
작업파일이 자동저장되었습니다.
9
10
프로그램을 종료합니다.

스레드의 상태

상태 설명
NEW 스레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE 실행 중 또는 실행 가능한 상태
BLOCKED 동기화블럭에 의해서 일시정지된 상태(lock이 풀릴 때까지 기다리는 상태)
WAITING,
TIMED_WAITING
스레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable) 일시정지 상태.
TIMED_WAITING은 일시정지시간이 지정된 경우를 의미
TERMINATED 스레드의 작업이 종료된 상태.

스레드의 실행제어

- 스레드의 실행을 제어할 수 있는 메소드가 제공된다.

이 들을 활용해서 보다 효율적인 프로그램의 작성할 수 있다.

 

메서드 설명
static void sleep(long millis)
static void sleep(long millis, int nanos)
(잠들기)
지정된 시간(천분의 일초 단위)동안 쓰레드를 일시정지시킨다.
지정한 시간이 지나고 나면, 자동적으로 다시 실행대기 상태가 된다.
void join()
void join(long millis)
void join(long millis, int nanos)
(기다리기)
지정된 시간동안 쓰레드가 실행되도록 한다. 지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속한다.
void interrupt()
(깨우기)
sleep()이나  join()에 의해 일시정지상태인 쓰레드를 깨워서 실행대기 상태로 만든다. 해당 쓰레드에서 interruptedException이 발생함으로써 일시정지 상태를 벗어나게 된다.
void stop() 쓰레드를 즉시 종료시킨다.
void suspend() (일시정지) 쓰레드를 일시정지 시킨다. resume()을 호출하면 다시 실행대기 상태가 된다.
void resume() (재개) suspend()에 의해 일시정지상태에 있는 쓰레드를 실행대기 상태로 만든다.
static void yield() (양보) 실행 중에 자신에게 주어진 실행시간을 다른 쓰레드에게 양보하고 자신은 실행대기상태가 된다.