Java 中Object中的 wait、notify/notifyAll 方法詳解


1、wait()、notify/notifyAll() 方法是Object的本地final方法,無法被重寫。

2、wait()執行后擁有當前鎖的線程會釋放該線程鎖,並處於等待狀態(等待重新獲取鎖)

3、notify/notifyAll() 執行后會喚醒處於等待狀態線程獲取線程鎖、只是notify()只會隨機喚醒其中之一獲取線程鎖,notifyAll() 會喚醒所有處於等待狀態的線程搶奪線程鎖。

三個方法的最佳實踐代碼如下:

 

public class WaitAndNotify {
    public static void main(String[] args) {
        MethodClass methodClass = new MethodClass();
        Thread t1 = new Thread(() -> {
            try {
                methodClass.product();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }, "t1");
        Thread t2 = new Thread(() -> {
            try {
                methodClass.customer();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }, "t2");
        Thread t3 = new Thread(() -> {
            try {
                methodClass.customer();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }, "t3");
        t1.start();
        t2.start();
        t3.start();

    }
}

class MethodClass {
    // 定義生產最大量
    private final int MAX_COUNT = 20;

    int productCount = 0;

    public synchronized void product() throws InterruptedException {
        while (true) {
            System.out.println(Thread.currentThread().getName() + ":::run:::" + productCount);
            Thread.sleep(10);
            if (productCount >= MAX_COUNT) {
                System.out.println("貨艙已滿,,.不必再生產");
                
                wait();
            }else {
                productCount++;
            }
            
            notifyAll();
        }
    }

    public synchronized void customer() throws InterruptedException {
        while (true) {
            System.out.println(Thread.currentThread().getName() + ":::run:::" + productCount);
            Thread.sleep(10);
            if (productCount <= 0) {
                System.out.println("貨艙已無貨...無法消費");
                wait();
            }else {
                productCount--;
            }
            
            notifyAll();
        }
    }
}

結果:

t1:::run:::0
t1:::run:::1
t1:::run:::2
t1:::run:::3
t1:::run:::4
t1:::run:::5
t1:::run:::6
t1:::run:::7
t1:::run:::8
t1:::run:::9
t1:::run:::10
t1:::run:::11
t1:::run:::12
t1:::run:::13
t1:::run:::14
t1:::run:::15
t1:::run:::16
t1:::run:::17
t1:::run:::18
t1:::run:::19
t1:::run:::20
貨艙已滿,,.不必再生產
t3:::run:::20
t3:::run:::19
t3:::run:::18
t3:::run:::17
t3:::run:::16
t3:::run:::15
t3:::run:::14
t3:::run:::13
t3:::run:::12
t3:::run:::11
t3:::run:::10
t3:::run:::9
t3:::run:::8
t3:::run:::7
t3:::run:::6
t3:::run:::5
t3:::run:::4
t3:::run:::3
t3:::run:::2
t3:::run:::1
t3:::run:::0
貨艙已無貨...無法消費
t2:::run:::0
貨艙已無貨...無法消費
t1:::run:::0
t1:::run:::1
t1:::run:::2
t1:::run:::3
t1:::run:::4
t1:::run:::5
t1:::run:::6
t1:::run:::7
t1:::run:::8
t1:::run:::9
t1:::run:::10
t1:::run:::11
t1:::run:::12
t1:::run:::13
t1:::run:::14
t1:::run:::15
t1:::run:::16
t1:::run:::17
t1:::run:::18
t1:::run:::19
t1:::run:::20
貨艙已滿,,.不必再生產
t2:::run:::20
t2:::run:::19
t2:::run:::18
t2:::run:::17
t2:::run:::16
t2:::run:::15
t2:::run:::14
t2:::run:::13
t2:::run:::12
t2:::run:::11
t2:::run:::10
t2:::run:::9
t2:::run:::8
t2:::run:::7
t2:::run:::6
t2:::run:::5
t2:::run:::4
t2:::run:::3
t2:::run:::2
t2:::run:::1
t2:::run:::0
貨艙已無貨...無法消費

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM