Condition类是Java中用于线程间协调的一种机制。它通常与ReentrantLock结合使用,用于在特定条件下等待和唤醒线程。
Condition提供了以下几个重要的方法:
- await():使当前线程进入等待状态,直到被其他线程通过signal()或signalAll()方法唤醒。
- awaitUninterruptibly():与await()相似,但不会响应中断。
- signal():唤醒一个正在等待的线程,如果有多个线程在等待,则只会唤醒其中一个线程。 signalAll():唤醒所有正在等待的线程。
下面是一个简单示例代码,演示了如何使用ReentrantLock和Condition来实现线程间的协作:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionExample {
private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void waitForSignal() throws InterruptedException {
lock.lock();
try {
System.out.println("Waiting for signal...");
condition.await();
System.out.println("Received signal!");
} finally {
lock.unlock();
}
}
public void sendSignal() {
lock.lock();
try {
System.out.println("Sending signal...");
condition.signal();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
ConditionExample example = new ConditionExample();
Thread waitingThread = new Thread(() -> {
try {
example.waitForSignal();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread signalingThread = new Thread(example::sendSignal);
waitingThread.start();
// 确保等待线程先启动
Thread.sleep(100);
signalingThread.start();
waitingThread.join();
signalingThread.join();
}
}
在上面的示例中,waitForSignal()
方法使用了await()
方法使当前线程进入等待状态。在另一个线程中,sendSignal()
方法使用了signal()
方法来唤醒正在等待的线程。
当运行该示例代码时,你会看到输出结果类似于:
Waiting for signal...
Sending signal...
Received signal!
这说明等待线程成功地接收到了信号并被唤醒。