(참고)

yeild(), sleep(), join() <- Thread의 메소드 입니다.

wait(), notify(), notifyAll()  <- Object의 메소드 입니다. (스레드가 가지고 있는 메소드가 아님..)

 

 

 

 


 

 

 

 

wait() notify(), notifyAll()

동기화(synchronized)된 블럭 안에서만 사용을 해야 합니다.

여기가 아니면, 다른 곳에서 wait() 와 notify(), notifyAll()은 사용할 수가 없습니다.

 

 

 

 


 

 

 

wait()를 만나게 되면,

해당 스레드는 해당 객체에 "모니터링락"에 대한 권한을 가지고 있었다면,

"모니터링락"에 권한을 놓고, 대기하게 됩니다.

 

 

 

 


 

 

 

 

wait()호출한 스레드일시정지가 됩니다.

그러면, 그 스레드는 일시정지 상태가 되어서, "Waiting Pool"에서 관리가 됩니다.

 

그리고,

 

일시정지된 스레드는 자기 스스로 절대로 "실행대기 상태"로 갈 수가 없습니다.

 

그래서 다른 곳에서 실행 중인 다른 스레드가 

notify(), notifyAll()을 호출을 해줘야지만,!!!  "일시정지된 스레드"가 "실행대기 상태"로 갈 수가 있습니다.

 

 

 

예제)

 

 


 

 

 

wait()

- 자기 스스로 절대로 "실행대기"로 갈 수가 없습니다.

- 다른 스레드가 notify(), notifyAll()을 호출해야지만,

"실행대기"로 갈 수 있습니다.

wait(long timeout)

- 해당 매개변수의 시간이 지나면, 자동적으로

"실행대기상태"로 갑니다.

 

- 근데, 시간 설정을 해주었지만, 아직 시간이 안되었는데,

다른 스레드가 notify(), notifyAll()을 호출하게 되면,

그 즉시 "실행대기상태"로 갑니다.

 

 

 

 


 

 

 

 

- wait()하고 sleep의 차이점

sleep()은 주어진 시간이 다 되어야지만 "실행대기상태"로 가지만

wait()는 주어진 시간이 다 안되어도, 다른 스레드가  notify(), notifyAll()을 호출하게 되면, "실행대기상태"로 돌아 갈 수 있습니다.

 

 

 

 

 


 

 

 

예제)