이것이 자바다 - 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상태가 된다.
'Language > Java' 카테고리의 다른 글
LOG4J2와 로깅 라이브러리 (0) | 2020.06.11 |
---|---|
얕은 복사를 피하기 위해서 참조객체는 clone을 재구현해야 한다? (0) | 2019.10.21 |
타입파라미터를 제한하는 방법은 두가지이다. (0) | 2019.09.02 |
Future<T> submit(Runnable task, T result)는 무엇을 리턴하나? (0) | 2019.08.31 |
CompletionService의 take()의 용도 (0) | 2019.08.30 |
댓글