当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒所有线程),线程被唤醒后会进入锁池,等待获取锁标记。
wait() 必须在synchronized 函数或者代码块里面
wait()会让已经获得synchronized 函数或者代码块控制权的Thread暂时休息,并且丧失控制权
这个时候,由于该线程丧失控制权并且进入等待,其他线程就能取得控制权,并且在适当情况下调用notifyAll()来唤醒wait()的线程。
需要注意的是,被唤醒的线程由于已经丧失了控制权,所以需要等待唤醒它的线程结束操作,从而才能重新获得控制权。
所以wait()的确是马上让当前线程丧失控制权,其他的线程可以乘虚而入。
所以wait()的使用,必须存在2个以上线程,而且必须在不同的条件下唤醒wait()中的线程。
notifyAll()并不是让当前线程马上让出控制权,而只是让其他wait()当中的线程唤醒而已,
尽管我唤醒你,可你必须还是要等我线程操作完成,并且被唤醒的线程仍需和其他醒的线程一起争夺CPU执行权。
|