WaitSet和EntryList是不同的。
obj.wait(): 让获得锁的线程(Owner)去WaitSet等待.
obj.wait(long time):让获得锁的线程(Owner)去WaitSet等待time ms,如果等待期间没有被唤醒,时间结束后自动唤醒,获得cpu时间片后再去运行后面的code。如果等待期间被唤醒,停止等待,运行后面的codes.
obj.wait(long time, int nanos): 第一个参数是ms,第二个参数是纳秒
obj.notify():在WaitSet中随即唤醒一个线程到EntryList里
obj.notifyAll(): 唤醒WaitSet中的所有线程到EntryList里
必须获得此对象的锁成为Owner后,才能调用这些方法;
sleep和wait异同:
1.同为等待,且进入WaitSet里面
2.sleep等待时不会释放锁,wait等待会释放锁。
3.sleep在线程任意处可用,wait必须拿到锁(与synchronized一起使用)后才能使用。
4.sleep是Thread的静态方法,wait是对象的方法。
wait和notify的正确使用:
synchronized(lock){
while(条件不满足) { lock.wait(); }
//干活;
}
//另一个线程
synchronized(lock) {
lock.notifyAll();
}