Thread상태상수인 WAITING, BLOCKED와 상태제어 메소드인 wait()과 notify()의 관계
이것이 자바다 - 12장 멀티스레드 - 스레드 상태 제어
notify()메소드와 wait()메소드는 스레드에서 사용하는 것이 아니라 공유객체에서만 사용된다.
스레드 상태중에 일시정지를 의미하는 상수로
WAITING, BLOCKED, TIMED-WAITING이 있다.
상태를 중심으로 생각해보면,
TIMED-WAITING은 sleep()메소드를 사용하면 이뤄지는 상태변화이다.
WAITING은 wait()메소드나 join()메소드를 사용하면 이뤄지는 상태변화이다.
BLOCKED는 공유객체의 synchronized메소드나 synchronized블록을 수행하는 스레드가 있는 상황에서
이 공유객체에 접근하는 다른 스레드들이 얻게되는 상태변화이다.
이제 거꾸로 wait()메소드나 notify()메소드 같이 메소드를 중심으로 상태를 살펴보자.
어느 메소드를 호출하면 어떤 상태변화가 이뤄지는지 명확히 알고 있는가?
public class WorkObject {
public synchronized void methodA(){
System.out.println("ThreadA의 methodA() 작업실행");
notify();
try {
wait();
} catch (InterruptedException e) {}
}
}
참고로 위의 코드처럼 wait()메소드와 notify()메소드는 공유객체의 synchronized메소드나 synchronized블록안에만
작성할 수 있다.
현재 스레드1이 공유객체를 사용하고 있다고 하자
잠겨있는 공유객체에 접근하는 다른 스레드들은 BLOCKED상태가 된다.
스레드1이 공유객체에 용무를 마치면 스케줄러에 의해 다른 스레드들 중 하나가 RUNNABLE상태가 된다.
즉 특정 상태 제어 메소드의 사용에 의한 것이 아니라 잠겨있는 공유객체에 접근하는 것에 의해서만 BLOCKED상태가 결정된다. BLOCKED상태는 이렇게 설명을 끝낼 수 있다.
WAITING상태는 어떻게 설명할까? 이쯤해서 위의 코드를 보면 알겠지만,
notify()메소드와 wait()메소드는 스레드에서 사용하는 것이 아니라 공유객체에서만 사용된다.
이 말은 현재 이 작업객체에 용무를 보고 있는 스레드만 notify()와 wait()메소드와 가장 직접적인(주체적인) 연관이 있다는 말이다.
수행중인 스레드1이 notify()메소드에서 BLOCKED되어 있는 다른 스레드를 RUNABLE상태가 되도록 만들고
wait()메소드에서 스레드1 자신은 WAITING상태가 된다.