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 貨艙已無貨...無法消費
