江明涛的博客
Java notify 是如何通知线程的?
Java notify 是如何通知线程的?

Java notify 是如何通知线程的?

Java中的notify()方法用于通知等待状态的线程,告诉它们可以继续执行了。但是,在使用notify()方法之前,我们需要先了解一些相关的概念。

Java中的线程通信是通过对象的监视器(monitor)来实现的。当一个线程调用对象的wait()方法时,它会释放对象的锁,并进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它。在这之前,我们需要确保当前线程是当前对象的所有者,也就是说,它已经获取了该对象的锁。

notify()方法可以随机唤醒等待状态的一个线程,而notifyAll()方法会唤醒所有等待状态的线程。但是,并不是通知线程立即从等待状态变为运行状态,它们仍然需要竞争获取对象的锁,只有一个线程成功获取到锁后才能继续执行。

为了更好地理解notify()方法的工作原理,我们可以通过一个简单的示例来说明:

public class ThreadCommunicationExample {
    private boolean flag = false;
    public synchronized void waitForFlag() {
        try {
            while (!flag) {
                wait();
            }
            System.out.println("Thread notified!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public synchronized void setFlag() {
        flag = true;
        notifyAll();
    }
}

在上面的示例中,我们定义了一个ThreadCommunicationExample类,其中包含了一个标志位flag和两个同步方法waitForFlag()和setFlag()。在waitForFlag()方法中,我们使用了一个while循环来等待直到flag为true,然后调用wait()方法使线程进入等待状态。在setFlag()方法中,我们将flag设置为true,并调用notifyAll()方法来通知所有等待状态的线程。

当我们创建一个ThreadCommunicationExample对象并启动多个线程时,它们会根据flag的值进入等待状态。当某个线程调用了setFlag()方法并成功获取到对象的锁后,它会唤醒所有处于等待状态的线程,并将它们从等待状态转换为运行状态。此时,这些线程将继续执行waitForFlag()方法后面的代码,打印出”Thread notified!”。

通过这个示例,我们可以看到notify()方法是如何通知等待状态的线程的。它们会被唤醒,但在获取到对象的锁之前,仍然无法继续执行。这种线程通信机制是Java中一种重要的实现方式,可以有效地协调多个线程的工作。