天天看點

Java從零開始學多線程——7.線程間的通信 wait、notify、notifyAll 等待通知經典模型之生産者消費者 使用管道流進行通信 PipedOutputStream、PipedInputS

wait、notify、notifyAll

何時使用

在多線程環境下,有時候一個線程的執行,依賴于另外一個線程的某種狀态的改變,這個時候,我們就可以使用wait與notify或者notifyAll

wait跟sleep的差別

wait會釋放持有的鎖,而sleep不會,sleep隻是讓線程在指定的時間内,不去搶占cpu的資源 注意點 wait notify必須放在同步代碼塊中, 且必須擁有目前對象的鎖,即不能取得A對象的鎖,而調用B對象的wait 哪個對象wait,就得調哪個對象的notify

notify跟notifyAll的差別

nofity随機喚醒一個等待的線程​ notifyAll喚醒所有在該對象上等待的線程

代碼實操

1.兩個線程,隻用while循環+flag來判斷是否執行,消耗資源

public class Demo {
   
    private static volatile