1
JavaAdvanced#concurrency
Thread.sleep() pauses the current thread for a set time without releasing any locks it holds. Object.wait() releases the object's monitor lock and pauses until notified, and must be called within a synchronized block.
Thread.sleep(1000); // holds any locks it has
// vs
synchronized(lock) { lock.wait(1000); } // releases lock while waiting