Java中的Condition接口属于java.util.concurrent包下的一种同步工具。它允许线程等待特定的条件发生,然后再继续执行操作。Condition接口通常与ReentrantLock锁对象一起使用。
Condition接口常用的方法有以下几个:
- await():使当前线程等待直到条件发生或被中断。
- awaitUninterruptibly():与await()相似,但是不会对中断做出反应,即使线程被中断也会继续等待。
- signal():唤醒一个等待在该条件上的线程,如果有多个线程在等待,唤醒其中一个线程。
- signalAll():唤醒所有等待在该条件上的线程。
使用Condition接口需要首先获取锁对象,然后在锁对象上调用newCondition()方法创建一个Condition对象。之后在使用 await()、signal() 等方法时,需要先获取锁对象,这样才能保证线程安全。
下面是一个例子,演示了Condition接口如何使用:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionExample {
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void doSomething() throws InterruptedException {
lock.lock(); // 获取锁对象
try {
// 判断条件是否满足
boolean conditionMet = isConditionMet();
while (!conditionMet) {
// 如果条件不满足,当前线程等待
condition.await();
// 重新判断条件是否满足
conditionMet = isConditionMet();
}
// 执行操作
doOperation();
} finally {
lock.unlock(); // 释放锁对象
}
}
private boolean isConditionMet() {
// 判断条件是否满足
// ...
return true;
}
private void doOperation() {
// 执行操作
// ...
}
public void signal() {
lock.lock(); // 获取锁对象
try {
// 唤醒等待在该条件上的一个线程
condition.signal();
} finally {
lock.unlock(); // 释放锁对象
}
}
public void signalAll() {
lock.lock(); // 获取锁对象
try {
// 唤醒等待在该条件上的所有线程
condition.signalAll();
} finally {
lock.unlock(); // 释放锁对象
}
}
}
在上面的例子中,如果条件不满足,线程将会调用await()方法等待,直到其他线程调用signal()或signalAll()方法唤醒该线程。在signal()和signalAll()方法被调用后,线程会重新尝试获取锁对象,并根据条件是否满足来决定是否继续执行操作。
本文介绍Java中Condition接口,它是java.util.concurrent包下的同步工具,常与ReentrantLock锁对象配合使用。阐述了await()、awaitUninterruptibly()、signal()、signalAll()等常用方法,还说明了使用时要先获取锁对象以保证线程安全,并给出使用示例。

被折叠的 条评论
为什么被折叠?



