when wait() is called, one of four things occur:
-another thread invokes the notify() method for this object and
the scheduler arbitrarily chooses to run the thread
-another thread invokes the notifyAll() method for this object
-another thread interrupts this thread
-the specified wait() time elapses
when one of the above occurs, the thread becomes re-available to the Thread scheduler and competes for a lock on the object once it regains the lock on the object, everything resumes as if no suspension had occurred..
So waiting method becomes runable only after it releases lock.