A sleeping thread will wake after the amount of time specified in the sleep call, and will then resume execution. A thread that called wait will not execute until a corresponding notify call is made by some other thread. That could happen almost immediately after calling wait, or it could happen much later, or maybe never. So the difference is sleeping for a fixed amount of time vs. sleeping until an external event occurs.
Thread.Sleep(long) Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds.
Object.wait(long) Causes current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.
wait() must be called from within a synchronize block, and when its called it releases the synchronization lock bka monitor. sleep() has nothing to do with synchronization and does not affect any monitors.