江明涛的博客
notifyAll 的语法
notifyAll 的语法

notifyAll 的语法

notifyAll是Java中的一个关键字,用于在多线程编程中用于解决线程间的通信问题。它的作用是唤醒正在等待该对象锁的所有线程,使它们从等待状态变为可运行状态。

在Java中,可以通过以下语法来使用notifyAll:

public final native void notifyAll();

上述语法表示notifyAll是一个final修饰的本地方法,意味着它是由底层操作系统或虚拟机提供的原生方法。

notifyAll方法必须在同步代码块或同步方法中使用,以获取对象锁并唤醒等待线程。当一个线程调用notifyAll后,所有在该对象上调用wait()方法进入等待状态的线程都会被唤醒。

需要注意的是,notifyAll并不会立即释放对象锁,而是在当前线程执行完同步代码块后才会释放。因此,被唤醒的线程需要重新竞争对象锁,才能继续执行。

另外,必须在对象锁上调用notifyAll才能唤醒等待线程,调用其他对象锁上的notifyAll方法将无效。

下面是一个简单的例子,演示了如何使用notifyAll:

class Message {
    private String message;
    
    public synchronized void setMessage(String message) {
        this.message = message;
        notifyAll(); // 唤醒等待线程
    }
    
    public synchronized void printMessage() {
        try {
            while (message == null) {
                wait(); // 等待消息
            }
            System.out.println("Message: " + message);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class NotifyAllExample {
    public static void main(String[] args) {
        Message message = new Message();
        
        // 创建并启动两个打印线程
        Thread printThread1 = new Thread(() -> {
            message.printMessage();
        });
        Thread printThread2 = new Thread(() -> {
            message.printMessage();
        });
        printThread1.start();
        printThread2.start();
        
        // 主线程设置消息并唤醒等待线程
        message.setMessage("Hello, World!");
    }
}

在上面的例子中,我们创建了一个Message类,其中包含了setMessage和printMessage两个方法。setMessage方法负责设置消息,并在设置完毕后调用notifyAll来唤醒等待线程。printMessage方法则负责打印消息,如果消息为空则进入等待状态。

在主线程中,我们创建并启动了两个打印线程,然后通过调用message.setMessage方法设置消息并唤醒等待线程。这样,等待线程就可以打印出设置的消息。

以上就是关于notifyAll的语法和用法的介绍。