Java教程

Java notifyAll()方法

线程类的 notifyAll()方法用于唤醒所有线程。此方法将通知发送给特定对象的 所有等待线程
如果我们使用notifyAll()方法并且有多个线程正在等待通知,则所有线程都将收到通知但是线程的执行将一个接一个地执行,因为线程需要一个锁,并且一个对象只能使用一个锁。

语法

public final void notifyAll()

返回

此方法不返回任何值。

异常

IllegalMonitorStateException: 如果当前线程不是对象监视器的所有者,则会引发此异常。

示例

class Notify1 extends Thread {
    public void run() {
        synchronized(this) {
            System.out.println("Starting of " + Thread.currentThread().getName());
            try {
                this.wait();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "...notified");
        }
    }
}
class Notify2 extends Thread {
    Notify1 notify1;
    Notify2(Notify1 notify1) {
        this.notify1 = notify1;
    }
    public void run() {
        synchronized(this.notify1) {
            System.out.println("Starting of " + Thread.currentThread().getName());
            try {
                this.notify1.wait();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "...notified");
        }
    }
}
class Notify3 extends Thread {
    Notify1 notify1;
    Notify3(Notify1 notify1) {
        this.notify1 = notify1;
    }
    public void run() {
        synchronized(this.notify1) {
            System.out.println("Starting of " + Thread.currentThread().getName());
            // call the notifyAll() method this.notify1.notifyAll();
            System.out.println(Thread.currentThread().getName() + "...notified");
        }
    }
}
public class JavaNotifyAllExp {
    public static void main(String[] args) throws InterruptedException {
        Notify1 notify1 = new Notify1();
        Notify2 notify2 = new Notify2(notify1);
        Notify3 notify3 = new Notify3(notify1);
        // creating the threads Thread t1 = new Thread(notify1, "Thread-1");
        Thread t2 = new Thread(notify2, "Thread-2");
        Thread t3 = new Thread(notify3, "Thread-3");
        // call run() method t1.start();
        t2.start();
        Thread.sleep(100);
        t3.start();
    }
}
输出:
Starting of Thread-1Starting of Thread-2Starting of Thread-3Thread-3...notifiedThread-2...notifiedThread-1...notified

昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4