情境
要怎麼解釋wait的作用, 蠻難的. 這主題讓我想破了頭, 該用什麼例子讓大家輕易的明白呢.
好啦, 還是用我們的經典例子~~神奇寶貝來說明吧.
我的公司專門生產皮卡丘的玩偶. 公司每秒鐘只能生產一隻皮卡丘. 但因為賣的太好了, 很多的Vendor(販賣商, A店, B店, C店)都要來搶貨.
Vendor當然是到我公司的倉庫搶, 倉庫只有一個出貨窗口. 大家一個一個來, 有貨就通知ABC店來搶. 搶得到就拿去賣. 搶不到就只能跟買主說缺貨啦.
主程式
class Factory是我的公司, 專門製造皮卡丘玩偶.
Thread t1, t2, t3, 是我的販賣商, 三不五時都有客人要來買皮卡丘.
而我的公司有inventory(倉庫), getGoods(取貨)
class Pikachu則是我公司的產品.
重點
wait, 是讓目前執行緒, 在擁有某物件鎖且進入synchronized區塊後, 調用此物件的wait方法, 然後將目前執行緒推入等待區暫緩執行.
所以要使用wait方法, 一定要在synchronized的區塊會方法中. 執行緒經由wait推入blocked區後, 會交出物件鎖, 供其他執行緒使用.
其他執行緒取得物件鎖(進入synchronized)後, 可以使用notify通知等待區的一個執行緒復活. 或使用notifyAll讓所有執行緒復活.
請注意, factory.wait(); 是擁有factory物件鎖的執行緒到blocked區, 並不是factory去等待區.
