應用場景:生産者和消費者問題
假設倉庫中隻能存放一件産品,生産者将生産出來的産品放入倉庫,消費者将倉庫中的産品取走消費
如果倉庫中沒有産品,則生産者将産品放入倉庫,否則停止生産并等待,知道倉庫中的産品被消費者取走為止
如果倉庫中放有産品,則消費者可以将産品取走消費,否則停止消費并等待,知道倉庫中再次放入産品為止
這是一個線程同步問題,生産者和消費者共享同一個資源,并且生産者和消費者之間互相依賴,互為條件
對于生産者,沒有生産産品之前,要通知消費者等待,而生産了産品之後,又需要馬上通知消費者消費
對于消費者,在消費之後,要通知生産者已經結束消費,需要生産新的産品以供消費
在生産者消費者問題中,僅有synchronized是不夠的
synchronized可組織并發更新同一個共享資源,實作了同步
synchronized不能用來實作不同線程之間的消息傳遞(通信)
wait() 表示線程一直等待,直到其他線程通知,與sleep不同,會釋放鎖
wait(long timeout) 指定等待的毫秒數
notify() 喚醒一個處于等待狀态的線程
notifyAll() 喚醒同一個對象上所有調用wait()方法的線程,優先級别高的線程優先排程
注意:均是Object類的方法,都隻能在同步方法或者同步代碼塊中使用,否則會抛出異常
生産者:負責生産資料的子產品
消費者:負責處理資料的子產品
緩沖區:消費者不能直接使用生産者的資料,他們之間有個緩沖區
生産者将生産好的資料放入緩沖區,消費者從緩沖區拿出資料
一個标志位,如果為真就等待,如果為假,就通知另一個