首先看一下里面線程間的通信問題:
一個線程向數據存儲空間添加數據(生產者),另一個線程從數據存儲空間去出數據(消費者)。
這個程序中有兩個可能出現的問題需要考慮:
1、 假設生產者線程剛向數據存儲空間添加了一個食品的名字,還沒有加入這個食品的屬性,CPU就切換到了消費者線程,消費者線程將把這個食品的名字和這個人的屬性聯系在一起。
2、 消費者拿東西都希望自己拿到的是最新的,即生產者剛生產出,消費者就拿走,而不是拿一些陳舊的。可能出現消費者拿不了最新的在程序中的原因,生產者放了若干次的數據,消費者才開始取數據,或者是,消費者取完一個數據后,還沒等到生產者放入新的數據,即消費者比生產者快時,又重復取出這個數據
下面我們看一下具體的代碼,來體驗一下生產者與消費者的關系,平我們去吃麥當勞時,總會要點吃的喝的,比如我們吃個漢堡喝個咖啡,而且這些都要是最新的,都是他們現做的。
第一個問題已經解決啦,但第二個問題還是存在,這個問題我們可以用線程的等待喚醒機制即wait(),notify()方法來解決
Wait()告訴當前線程放棄監視器并進入睡眠狀態,直到其他線程進入同一監視器并調用notify()為止
Notify()喚醒同一對象監視器中調用wait()的第一線程