生产者-消费者实现(缓冲池为1,用一个整数表示一个产品)

[u]转自http://www.riabook.cn/doc/designpattern/ProducerConsumer.htm[/u][size=medium]Producer Consumer模式与 Guarded Suspension 模式 是类似的,只不过Guarded Suspension模式并不限制缓冲区的长度,Producer Consumer模式假设所生产的产品放置在一个长度有限制的缓冲区(就像是一个产品桌,它可以摆放的空间是有限的),如果缓冲区满了,则生产者必须停止继续将产品放到缓冲区中,直到消费者取走了产品而有了空间,而如果缓冲区中没有产品,当然消费者必须等待,直到有新的产品放到缓冲区中。

以下是一个最简单的:生产者每次生产一个整数并放置在桌子上,而消费者消耗整数,桌子上一次只能放置一个整数,如果桌子上已有整数,则生产者等待消费者将整数消耗并通知生产者生产下一个整数,如果桌子上没有整数,则消费者等待生产者生产整数并通知消费者可以消耗整数。[/size]
package cache;
//生产者
public class Producer extends Thread {
private ProductTable productTable;

public Producer(ProductTable productTable) {
this.productTable = productTable;
}

public void run() {
System.out.println("Produce integer......");
for (int product = 1; product <= 10; product++) {
try { // wait for a random time
Thread.sleep((int) Math.random() * 3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
productTable.setIntProduct(product); //向桌面放置一个整数,代表生成了一个产品
}
}
}

package cache;
//消费者
public class Consumer extends Thread {
private ProductTable productTable;

public Consumer(ProductTable productTable) {
this.productTable = productTable;
}

public void run() {
System.out.println("Comsume integer......");
for (int i = 1; i <= 10; i++) {
try { // wait for a random time
Thread.sleep((int) (Math.random() * 3000));
} catch (InterruptedException e) {
e.printStackTrace();
}
productTable.getProductInt(); //从桌面取出一个整数,代表消耗一个产品
}
}
}


package cache;

public class ProductTable { //充当缓冲池
private int productInt = -1; // -1 for no product

public synchronized void setIntProduct(int product) {
if (productInt != -1) { //如果还有产品,先等待,说明一次只能生成一个,直到这个消耗完之后才能生成下一个
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
productInt = product;
System.out.println("set (" + product + ")");
notify(); //通知消费者已经生产了一个产品
}

public synchronized int getProductInt() {
if (productInt == -1) { //如果没有产品,等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int p = productInt;
System.out.println("Get (" + productInt + ")");
productInt = -1; //消费完了,无产品了,
notify(); //通知生产者
return p;
}
}

测试的客户端:
package cache;

public class Client {

// 生产者会生产10个整数,而消费者会消耗10个整数,由于桌上只能放置一个整数,所以每生产一个就消耗一个。

public static void main(String[] args) {

ProductTable table = new ProductTable();
table.setIntProduct(-1);
Consumer c= new Consumer(table);
c.start();

Producer p = new Producer(table);
p.start();

}

}

测试结果:
set (-1)
Comsume integer......
Produce integer......
set (1)
Get (1)
set (2)
Get (2)
set (3)
Get (3)
set (4)
Get (4)
set (5)
Get (5)
set (6)
Get (6)
set (7)
Get (7)
set (8)
Get (8)
set (9)
Get (9)
set (10)
Get (10)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值