Difference between "wait()" vs "sleep()" in Java

java, java-threads, multithreading, sleep, wait

Solution

A `wait` can be "woken up" by another thread calling `notify` on the monitor which is being waited on whereas a `sleep` cannot. Also a `wait` (and `notify`) must happen in a block `synchronized` on the monitor object whereas `sleep` does not:

Object mon = ...;
synchronized (mon) {
    mon.wait();
} 

At this point the currently executing thread waits and releases the monitor. Another thread may do

synchronized (mon) { mon.notify(); }

(on the same `mon` object) and the first thread (assuming it is the only thread waiting on the monitor) will wake up.

You can also call `notifyAll` if more than one thread is waiting on the monitor – this will wake all of them up. However, only one of the threads will be able to grab the monitor (remember that the `wait` is in a `synchronized` block) and carry on – the others will then be blocked until they can acquire the monitor's lock.

Another point is that you call `wait` on `Object` itself (i.e. you wait on an object's monitor) whereas you call `sleep` on `Thread`.

Yet another point is that you can get spurious wakeups from `wait` (i.e. the thread which is waiting resumes for no apparent reason). You should always `wait` whilst spinning on some condition as follows:

synchronized {
    while (!condition) { mon.wait(); }
}

Problem

What is the difference between a `wait()` and `sleep()` in Threads? Is my understanding that a `wait()`-ing Thread is still in running mode and uses CPU cycles but a `sleep()`-ing does not consume any CPU cycles correct? Why do we have both `wait()` and `sleep()`? How does their implementation vary at a lower level?

Original source

Related problems