Java Thread notifyAll()方法

2019-10-16 22:24:52

Thread類的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-1
Starting of Thread-2
Starting of Thread-3
Thread-3...notified
Thread-2...notified
Thread-1...notified