본문 바로가기
Language/Java

Thread상태상수인 WAITING, BLOCKED와 상태제어 메소드인 wait()과 notify()의 관계

by fabxoe 2019. 9. 1.

이것이 자바다 - 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상태가 된다.

댓글