wait
和 notify
用于多线程协调运行:
- 在
synchronized
内部可以调用wait()
使线程进入等待状态;(获得了锁才能释放锁) - 必须在已获得的锁对象上调用
wait()
方法; - 在
synchronized
内部可以调用notify()
或notifyAll()
唤醒其他等待线程; - 必须在已获得的锁对象上调用
notify()
或notifyAll()
方法; - 已唤醒的线程还需要重新获得锁后才能继续执行。
- 在while中调用wait(),如果是
if
,在线程被唤醒后继续执行wait()
后面得逻辑,不会去重新获得锁;
class TaskQueue {
Queue<String> queue = new LinkedList<>();
public synchronized String getTask() throws InterruptedException{
while (queue.isEmpty()) {
// 释放this锁:
this.wait();
// 重新获取this锁
}
return queue.remove();
}
public synchronized void addTask(String s) {
this.queue.add(s);
this.notifyAll(); // 唤醒在this锁等待的线程
}
}