相比于 wait() 这种等待方式,await() 可以指定等待的条件,因此更加灵活。举个代码例子
时间: 2023-05-26 13:02:41 浏览: 49
:```java
public class AwaitExample {
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
public void doSomething() throws InterruptedException {
lock.lock();
try {
while (someConditionIsNotMet()) {
condition.await();
}
// do something
} finally {
lock.unlock();
}
}
public void meetCondition() {
lock.lock();
try {
// change some condition
condition.signalAll();
} finally {
lock.unlock();
}
}
private boolean someConditionIsNotMet() {
// return true or false based on some condition
return true;
}
}
```
在上述代码中,我们创建了一个 Lock 对象和一个 Condition 对象。在 doSomething() 方法中,我们先获得了 lock 的锁,然后在 while 循环中指定了等待的条件为 someConditionIsNotMet()。如果等待条件不满足,则调用 condition.await() 方法等待。在 meetCondition() 方法中,我们同样获得了 lock 的锁,然后通过改变条件并调用 condition.signalAll() 方法来通知其他线程条件已满足。
这里的 await() 和 signalAll() 方法是 Condition 接口中定义的方法,用于等待和通知其他线程。在使用时,需要先获得 Lock 对象的锁,保证线程安全。可以说 await() 和 signalAll() 可以让我们更加细粒度地控制线程的状态,尤其是在复杂的多线程场景中。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)