"안녕, 아미고!"

"그리고 몇 가지 더 자세한 내용이 있습니다. 실용적인 조언이라고 부르겠습니다."

"무언가를 기다리고 조건이 만족될 때까지 잠드는 메서드가 있다고 가정합니다."

컬렉션이 비어 있으면 기다립니다.
public synchronized Runnable getJob()
{
 if (jobs.size() == 0)
  this.wait();

 return jobs.remove(0);
}

"자바 문서는 루프에서 wait 메서드를 호출할 것을 매우 강력하게 권장합니다."

컬렉션이 비어 있으면 기다립니다.
public synchronized Runnable getJob()
{
 while (jobs.size() == 0)
  this.wait();

 return jobs.remove(0);
}

"왜? 문제는 스레드가 깨어난다고 해서 조건이 충족되는 것이 아니라는 것입니다. 그런 수면 스레드가 20개 정도 있었을지도 모릅니다. 모두 깨어났지만 작업을 수행할 수 있는 사람은 한 명뿐입니다."

"대략적으로 말하면 '거짓 경보'가 있을 수 있습니다. 훌륭한 개발자라면 이를 고려해야 합니다."

"그렇구나. 그냥 알림이 편하지 않아?"

"글쎄요, 목록에 하나 이상의 작업이 있다면 어떨까요? Notify는 일반적으로 최적화를 위해 사용하는 것이 좋습니다. 다른 모든 경우에는 notifyAll 메서드를 사용하는 것이 좋습니다."

"좋아요."

"그러나 더 있습니다. 첫째, 누군가가 귀하의 클래스를 상속하고, 자신의 메서드를 추가하고, wait/notifyAll도 사용하는 상황이 있을 수 있습니다. 즉, 독립적인 wait/notifyAll 쌍이 동일한 개체에서 대기하는 상황이 있을 수 있습니다. 그리고 서로에 대해 모른다. 그럼 어떻게 해야 할까요?"

"항상 루프에서 대기를 호출하고 루프의 종료 조건이 참인지 확인하십시오!"

"맞아요. 그리고 이것을 피할 수 없다는 것을 분명히 하기 위해, 많은 개발자들은 때때로 스레드가 스스로 깨어난다고 지적합니다. 실수로 깨어나지 않는 것이 보장된 스레드입니다. 이것은 코드 최적화의 부작용인 것 같습니다. Java 머신을 실행 중입니다."

"워. 알았어. 루프가 없으면 대기 방법이 좋지 않아."