Насколько я понимаю, что поток wait() будет находится в активном режиме (процессор с ним всё также работает), но он просто чего-то ожидает, а поток sleep() переходи в неактивный режим на указанное время (процессор на него не обращает внимания)?
Я конечно не сильно изучал Java, но оба эти метода должны работать аналогично и в С#, поэтому могу сказать следующее: wait - усыпляет определённый поток, при этом позволяет разбудить его из других частей Вашей программы sleep же просто усыпляет поток и он станет активным только после истечении указанного в нём времени (разбудить его вручную нельзя)
из выше приведённого можно сделать вывод, что wait зачастую используется при синхронизации нескольких потоков, а sleep только для различных рода задержек
wait может быть "пробуждено" другим потоком, вызывающим notify на мониторе, который ожидает, тогда как sleep не может. Также wait (и notify) должны находиться в блоке synchronized на объекте монитора, а sleep не обязательно:
Другой момент заключается в том, что wait вызывается для самого Object (т.е. вы ждете на мониторе объекта), тогда как sleep вызывается для определённого потока!
Еще один момент заключается в том, что вы можете получить ложные пробуждения от wait (то есть ожидающий поток возобновляется без видимой причины). Поэтому всегда рекомендуется wait поместить ещё в какой-то цикл с условием:
synchronized {
while (!condition) {
mon.wait();
}
}