chatgpt:

在 Java 中,notifyAll() 方法用于唤醒所有因调用 wait() 方法而被阻塞的线程。它是 Object 类的一部分,可以在任何对象上调用。这个方法的作用是唤醒所有在该对象的监视器锁(即该对象的 synchronized 块或方法)上等待的线程,但唤醒后并不会立即执行。线程必须重新竞争锁,才能继续执行。

线程状态的变化:

  1. 调用 notifyAll() 后:
  2. 线程的状态变化:

示例代码:

class SharedResource {
    private int counter = 0;

    public synchronized void increment() {
        counter++;
        notifyAll();  // 唤醒所有等待的线程
    }

    public synchronized void waitForValue(int value) throws InterruptedException {
        while (counter < value) {
            wait();  // 线程在此处等待,直到 counter 达到 value
        }
        System.out.println("Counter reached " + value);
    }
}

public class NotifyAllExample {
    public static void main(String[] args) throws InterruptedException {
        SharedResource resource = new SharedResource();

        // 创建多个线程,每个线程都会等待某个值
        Thread t1 = new Thread(() -> {
            try {
                resource.waitForValue(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                resource.waitForValue(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        t1.start();
        t2.start();

        // 让线程 t1 和 t2 等待
        Thread.sleep(1000);

        // 增加值并唤醒等待的线程
        resource.increment();  // 唤醒所有等待的线程
    }
}

解释:

  1. waitForValue() 方法会使线程等待直到 counter 的值达到一定的阈值。在这个例子中,counter 达到 5 时,线程会被唤醒。
  2. increment() 方法通过调用 notifyAll() 唤醒所有等待的线程,通知它们继续执行。
  3. notifyAll() 唤醒的线程并不马上执行,它们会进入就绪状态,等到它们重新获得锁后,才能继续执行。

线程状态变化:

注意事项: