多執行緒之生產者與消費者模型

2021-09-24 13:10:28 字數 2333 閱讀 4476

在這個模型中我們需要有三個主要類,分別是商品類,生產者類以及消費者類。

其中執行機制和我們平時的生產者與消費者的關係機制大同小異。

在這個模型中,我們需要定義乙個容器來實現消費者與生產者之間的解耦,為了更貼近實際,採用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...