對(duì)于多線程程序來(lái)說(shuō),不管任何編程語(yǔ)言,生產(chǎn)者和消費(fèi)者模型都是最經(jīng)典的。就像學(xué)習(xí)每一門(mén)編程語(yǔ)言一樣,Hello World!都是最經(jīng)典的例子。
實(shí)際上,準(zhǔn)確說(shuō)應(yīng)該是“生產(chǎn)者-消費(fèi)者-倉(cāng)儲(chǔ)”模型,離開(kāi)了倉(cāng)儲(chǔ),生產(chǎn)者消費(fèi)者模型就顯得沒(méi)有說(shuō)服力了。
對(duì)于此模型,應(yīng)該明確一下幾點(diǎn):
1、生產(chǎn)者僅僅在倉(cāng)儲(chǔ)未滿時(shí)候生產(chǎn),倉(cāng)滿則停止生產(chǎn)。
2、消費(fèi)者僅僅在倉(cāng)儲(chǔ)有產(chǎn)品時(shí)候才能消費(fèi),倉(cāng)空則等待。
3、當(dāng)消費(fèi)者發(fā)現(xiàn)倉(cāng)儲(chǔ)沒(méi)產(chǎn)品可消費(fèi)時(shí)候會(huì)通知生產(chǎn)者生產(chǎn)。
4、生產(chǎn)者在生產(chǎn)出可消費(fèi)產(chǎn)品時(shí)候,應(yīng)該通知等待的消費(fèi)者去消費(fèi)。
此模型將要結(jié)合java.lang.Object的wait與notify、notifyAll方法來(lái)實(shí)現(xiàn)以上的需求。這是非常重要的。
/**
* Java線程:并發(fā)協(xié)作-生產(chǎn)者消費(fèi)者模型
*/
public class Test {
public static void main(String[] args) {
Godown godown = new Godown(30);
Consumer c1 = new Consumer(50, godown);
Consumer c2 = new Consumer(20, godown);
Consumer c3 = new Consumer(30, godown);
Producer p1 = new Producer(10, godown);
Producer p2 = new Producer(10, godown);
Producer p3 = new Producer(10, godown);
Producer p4 = new Producer(10, godown);
Producer p5 = new Producer(10, godown);
Producer p6 = new Producer(10, godown);
Producer p7 = new Producer(80, godown);
c1.start();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
}
}
/**
* 倉(cāng)庫(kù)
*/
class Godown {
public static final int max_size = 100; //庫(kù)存量
public int curnum; //當(dāng)前庫(kù)存量
Godown() {
}
Godown(int curnum) {
this.curnum = curnum;
}
/**
* 生產(chǎn)指定數(shù)量的產(chǎn)品
*
* @param neednum
實(shí)際上,準(zhǔn)確說(shuō)應(yīng)該是“生產(chǎn)者-消費(fèi)者-倉(cāng)儲(chǔ)”模型,離開(kāi)了倉(cāng)儲(chǔ),生產(chǎn)者消費(fèi)者模型就顯得沒(méi)有說(shuō)服力了。
對(duì)于此模型,應(yīng)該明確一下幾點(diǎn):
1、生產(chǎn)者僅僅在倉(cāng)儲(chǔ)未滿時(shí)候生產(chǎn),倉(cāng)滿則停止生產(chǎn)。
2、消費(fèi)者僅僅在倉(cāng)儲(chǔ)有產(chǎn)品時(shí)候才能消費(fèi),倉(cāng)空則等待。
3、當(dāng)消費(fèi)者發(fā)現(xiàn)倉(cāng)儲(chǔ)沒(méi)產(chǎn)品可消費(fèi)時(shí)候會(huì)通知生產(chǎn)者生產(chǎn)。
4、生產(chǎn)者在生產(chǎn)出可消費(fèi)產(chǎn)品時(shí)候,應(yīng)該通知等待的消費(fèi)者去消費(fèi)。
此模型將要結(jié)合java.lang.Object的wait與notify、notifyAll方法來(lái)實(shí)現(xiàn)以上的需求。這是非常重要的。
/**
* Java線程:并發(fā)協(xié)作-生產(chǎn)者消費(fèi)者模型
*/
public class Test {
public static void main(String[] args) {
Godown godown = new Godown(30);
Consumer c1 = new Consumer(50, godown);
Consumer c2 = new Consumer(20, godown);
Consumer c3 = new Consumer(30, godown);
Producer p1 = new Producer(10, godown);
Producer p2 = new Producer(10, godown);
Producer p3 = new Producer(10, godown);
Producer p4 = new Producer(10, godown);
Producer p5 = new Producer(10, godown);
Producer p6 = new Producer(10, godown);
Producer p7 = new Producer(80, godown);
c1.start();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
}
}
/**
* 倉(cāng)庫(kù)
*/
class Godown {
public static final int max_size = 100; //庫(kù)存量
public int curnum; //當(dāng)前庫(kù)存量
Godown() {
}
Godown(int curnum) {
this.curnum = curnum;
}
/**
* 生產(chǎn)指定數(shù)量的產(chǎn)品
*
* @param neednum