(참고)
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()을 호출하게 되면, "실행대기상태"로 돌아 갈 수 있습니다.
예제)
'■ JAVA > Study' 카테고리의 다른 글
[JAVA] 람다식 (0) | 2020.04.29 |
---|---|
[JAVA] 스레드 - 7.데몬 스레드 (0) | 2020.04.29 |
[JAVA] 스레드 - 6-2.스레드와 상태제어 (join) - "스레드가 멈출 때(끝날때?)까지 기다리게 해주는 메소드" (0) | 2020.04.29 |
[JAVA] 스레드 - 6-1.스레드와 상태제어 설명 (0) | 2020.04.29 |
[JAVA] 스레드 - 5."동기화 메소드"와 "동기화 블록" (=synchronized사용법)★ (0) | 2020.04.29 |