Thread Wait, Notify, NotifyAll
이전 글에서 어떠한 쓰레드가 synchronized 메소드를 실행하고 있는 중에는 다른 쓰레드가 그 메소드를 실행 할 수 없다고 했다. 이는 매우 간단한 배타제어이다.
그렇다면 누군가 실행하고 있는중에는 대기한다고 하는 좀 더 치말한 제어를 원한다면 어떻게 해야할까?
이렇게 제어하려면 JAVA의 경우 wait, notify, notifyAll이라는 메소드를 사용해야 한다.
Wait은 쓰레들르 기다리게 하는 메소드이다. 그리고 notify, notifyAll은 대기하고 있던 쓰레드를 깨우는 메소드이다.
Wait set
모든 인스턴스는 wait set을 가진다. wait 셋은 그 인스턴스의 wait 메소드를 실행한 후 동작을 정지하고 있는 쓰레들의 집합이다.
쓰레드는 wait 메소드를 실행하면 동작을 일시 정지하고 wait set이라고 하는 대합실로 들어간다. 이제 대합실에 들어간 쓰레드는 다른 쓰레드에서 notify, notifyAll, interrupt 메소드에 의해 깨어나거나 wait 메소드가 타임아웃이 되어서 깨어난다.
wait 메소드를 실행하기 위해서는 쓰레드가 락을 가지고 있어야한다.(이것은 규칙이다)
wait 메소드 -> 쓰레드를 wait set이라는 대합실로 넣는다.
notify 메소드 -> 쓰레드를 wait set에서 꺼낸다.
notifyAll 메소드 -> 모든 쓰레드를 wait set에서 꺼낸다.
** notify의 쓰레드 선택
notify 메소드를 실행했을 때 wait set에서 대기중인 쓰레드가 여러 개라고 할 때 어느 쓰레드가 선택될지는 정해져 있지 않다.
'자바' 카테고리의 다른 글
| Thread Synchronized (0) | 2020.04.19 |
|---|---|
| Thread Sleep (0) | 2020.04.19 |
| How to Excute Thread!? (0) | 2020.04.19 |
| Thread - [multi Thread] (0) | 2020.04.19 |
| Thread [single Thread] (0) | 2020.04.19 |