Skip to content

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!

这说明等待线程成功地接收到了信号并被唤醒。