1.
wait() releases the lock on which you call
wait().
2.
sleep() is not associated with any locks, so there's nothing to release. You can call
sleep() outside of synchronized blocks, it has nothing to do with multi-threading.
Both methods suspend the current thread. That means CPU cycles are not wasted.
You should never call
wait() in your application. You should use the classes in
java.util.concurrent and
java.util.concurrent.locks instead.
You should never call
sleep() in your application. It is unreliable, and it's often a sign of a bad application design. If you want to perform tasks periodically, or after some delay, you should use
java.util.concurrent.ScheduledExecutorService, or when dealing with Swing,
javax.swing.Timer.