source : http://www.jguru.com/faq/view.jsp?EID=47127
Thread.sleep()
sends the current thread into the "Not Runnable" state for some amount of time. The thread keeps the monitors it has aquired -- i.e. if the thread is currently in a synchronized block or method no other thread can enter this block or method. If another thread callst.interrupt()
it will wake up the sleeping thread.Note that sleep is a static method, which means that it always affects the current thread (the one that is executing the sleep method). A common mistake is to call
t.sleep()
where t is a different thread; even then, it is the current thread that will sleep, not the t thread.
t.suspend()
is deprecated. Using it is possible to halt a thread other than the current thread. A suspended thread keeps all its monitors and since this state is not interruptable it is deadlock prone.
object.wait()
sends the current thread into the "Not Runnable" state, likesleep()
, but with a twist. Wait is called on an object, not a thread; we call this object the "lock object." Beforelock.wait()
is called, the current thread must synchronize on the lock object;wait()
then releases this lock, and adds the thread to the "wait list" associated with the lock. Later, another thread can synchronize on the same lock object and calllock.notify()
. This wakes up the original, waiting thread. Basically,wait()
/notify()
is likesleep()
/interrupt()
, only the active thread does not need a direct pointer to the sleeping thread, but only to the shared lock object.