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的语法和用法的介绍。