Sometimes one thread must pause until another has done its part, like a consumer waiting for a producer to add an item. wait() lets a thread sleep and release its lock, and notify() wakes a waiting thread when the condition changes. Use them for classic producer-consumer problems, always inside synchronized and with a while loop around the check. In modern code, a BlockingQueue usually does this job with less risk.