在這個模型中我們需要有三個主要類,分別是商品類,生產者類以及消費者類。
其中執行機制和我們平時的生產者與消費者的關係機制大同小異。
在這個模型中,我們需要定義乙個容器來實現消費者與生產者之間的解耦,為了更貼近實際,採用fifo原則的佇列作為容器為最佳選擇,並且此模型還遵循著以下兩條規則:
1.當生產者生產商品數量超過容器限制時,停止生產;
2.當消費者消費商品導致容器為空時,停止消費。
以下通過兩種方式來實現這個模型。
第一種方式:wait()方法和notify()方法
注意:在這個方法中需要把容器作為物件賦鎖。
首先定義乙個商品類:
class goods
public string getname()
public void setname(string name)
public string getid()
public void setid(string id)
public double getprice()
public void setprice(double price)
@override
public string tostring() ';
}}
定義乙個生產者類:
class producer implements runnable
@override
public void run() catch (interruptedexception e)
synchronized (this.queue) catch (interruptedexception e)
} else }}
}}
定義乙個消費者類:
class consumer implements runnable
@override
public void run() catch (interruptedexception e)
synchronized (this.queue) else }}
}}
最後定義乙個測試用例:
public static void code1()
//消費者執行緒
for (int i = 0; i < 2; i++)
}
方法二:使用阻塞佇列(這個方法好像還有一點問題,回頭再重新修改)
由於blockingqueue介面自帶阻塞的功能,所以也不需要格外加鎖。
如果該佇列已滿,該執行緒被阻塞;如果該佇列已空,該執行緒也被阻塞。
首先定義乙個商品類:
class goods1
public string getname()
public void setname(string name)
public string getid()
public void setid(string id)
public double getprice()
public void setprice(double price)
@override
public string tostring() ';
}}
定義乙個生產者類:
class producer1 implements runnable
@override
public void run() catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + "生產完成:" + goods);}}
}
定義乙個消費者類:
class consumer1 implements runnable
@override
public void run() catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + "消費完成:" + goods);}}
}
最後定義乙個測試用例:
public static void main(string args)
//消費者執行緒
for (int i = 0; i < 2; i++)
}
以上就是實現生產者與消費者模型的兩種方式。 多執行緒之生產者消費者模型
生產者消費者 乙個最簡單的模型。兩個執行緒,乙個生產者,乙個消費者,生產者負責生產,消費者負責消費。分析 同步 生產者生產了之後,消費者進行讀取資料。wait 和notify機制 互斥 生產者生產時,消費者不能進行讀取。鎖機制。public class producerandconsumer cat...
Java 多執行緒之生產者消費者模型
package com.yuanlief public class main 共享資料類 class mydata 共享資料控制類 class sharedata catch interruptedexception e this.data data writeable false 標記已經生產 n...
多執行緒之生產者消費者模型詳解
public static void main string args 4.建立消費者執行緒 class consumerthread extends thread override public void run catch interruptedexception e 3.建立生產者執行緒 cl...