两个线程类如何相互唤醒和等待
时间: 2024-11-30 09:17:48 浏览: 8
在Java中,我们可以使用`java.util.concurrent.locks.Condition`接口以及`ReentrantLock`或`CountDownLatch`等同步工具类来实现线程之间的唤醒和等待。这里我们以`Condition`为例,它是`BlockingQueue`、`Semaphore`和`CountDownLatch`等并发工具类的一个扩展,提供了更精细的控制。
首先,确保你有一个`ReentrantLock`实例,因为`Condition`是`ReentrantLock`的扩展:
```java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class SharedResource {
private final ReentrantLock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
// ... 其他相关业务逻辑
}
```
然后,在需要唤醒等待的线程的地方,你可以这样做:
```java
// 假设threadA正在等待condition,而threadB持有锁
public void wakeUpThreadA() throws InterruptedException {
lock.lock(); // 获取锁
try {
if (shouldWakeUp()) { // 检查条件是否满足
condition.signal(); // 唤醒一个等待该条件的线程
}
} finally {
lock.unlock(); // 释放锁
}
}
// 在某个地方设置好唤醒条件后调用
void setThreadAWakeCondition() {
shouldWakeUp = true; // 设置为true,模拟条件满足
// 可能还需要唤醒其他等待者
if (otherThreadsWaiting) {
condition.signalAll(); // 如果还有其他线程等待,全部唤醒
}
}
```
而在等待的线程上,你需要这样:
```java
public void waitUntilWoken() throws InterruptedException {
lock.lock(); // 获取锁
try {
condition.await(); // 当条件不满足时,此线程进入等待状态
// 当其他线程唤醒时,执行这里的代码
// ...
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 重新中断自己
} finally {
lock.unlock(); // 释放锁
}
}
```
阅读全文