利用wait()和notify()實現任務間的協同合作其實是一種非常低階的方式,我們還可以使用同步佇列來解決任務協作問題,blockingqueue在任何時刻都只允許乙個任務插入或者移除佇列,如果消費者試圖從佇列中獲取元素,而此時該隊列為空,那麼佇列可掛起消費者,當佇列內有元素時再恢復消費者任務。比wait()和notify()更簡單好用。
有這麼乙個事件,需要製作吐司供顧客食用,而吐司的製作分三個步驟:生產吐司、給吐司抹黃油、給抹了黃油吐司抹果醬,下面用blockingqueue的實現類linkedblockingqueue來執行這個過程:
定義吐司佇列:
public class toastqueueextends linkedblockingqueue
定義吐司類,用列舉值實現:
public class toast
private status status=status.dry;
private final int id;
public toast(int id)
public void butter()
public void jam()
public status getstatus()
public int getid()
@override
public string tostring()
}
生產吐司的執行緒:
public class toaster implements runnable
@override
public void run()
} catch (interruptedexception e)
system.out.println("土司製作完畢");
}}
抹黃油的執行緒:
public class butterer implements runnable
@override
public void run()
} catch (interruptedexception e)
system.out.println("黃油新增完畢");
}}
抹果醬的執行緒:
public class jammer implements runnable
@override
public void run()
} catch (interruptedexception e)
system.out.println("果醬新增完畢");
}}
吃(消費)吐司的執行緒:
public class eater implements runnable
@override
public void run() else system.out.println(t);
}} catch (interruptedexception e)
system.out.println("吃完了!!!");
}}
測試demo:
public class toastomatic
}
在這裡,多執行緒間的通訊沒有用到任何lock物件或者synchronized關鍵字的同步,同步由佇列所隱式地管理了,每個生產的toast在任何時刻都只有乙個執行緒在操作,通過佇列的阻塞,使得整個處理過程能自動地掛起和恢復執行,過程非常地清晰。
同步佇列還可用於非同步訊息處理機制中,把需要非同步的事件存入同步佇列,在多執行緒內掛起、取出事件進行處理。
Java多執行緒14 生產者 消費者模型
什麼是生產者 消費者模型 一種重要的模型,基於等待 通知機制。生產者 消費者模型描述的是有一塊緩衝區作為倉庫,生產者可將產品放入倉庫,消費者可以從倉庫中取出產品,生產者 消費者模型關注的是以下幾個點 生產者 模型作為一種重要的模型,它的優點在於 利用wait notify 實現生產者 消費者模型 既...
java多執行緒初探(零)生產者消費者模式 執行緒通訊
測試類 package gcc.twothreadtransdata.producerandconsumer import org.slf4j.logger import org.slf4j.logge ctory 多個執行緒之間通訊 消費者生產者模式 多個生產者和消費者 流程 多個執行緒 生產者,...
多執行緒通訊(二)生產者 消費者模式
生產者 消費者模式其原理是基於wait notify實現的。通過 更能便於理解,廢話不多說,上 生成者和消費者一對一模式 生產者public class producer public void buildproduct 生產產品並通知消費者 thread.sleep 1000 system.out...