问题描述
一组生产者向一组消费者提供消息,它们共享一个有界缓冲区n,生产者向其中投放消息,消费者从中取得消息
PV原语描述
void main() {
producer();
customer();
}
void producer() {
while(生产未完成) {
生产一个产品
p(empty)//empty 表示仓库还可以存放产品的空位
p(mutex)//对仓库的互斥访问
向仓库中存放一个产品
v(mutex)
v(full)
}
}
void customer() {
while(还要继续消费) {
p(full)//full表示仓库内现存产品数
p(mutex)
从仓库中取出一个产品
v(mutex)
v(empty)
消费产品
}
}
代码描述
package produce_customer3;
public class produce_customer {
public static void main(String[] args) {
House house=new House();
producer p=new producer(house);
customer c=new customer(house);
//System.out.println("Hello world");
new Thread(p).start();
new Thread(c).start();
}
}
//产品类
class Product {
int id;
Product(int id){
this.id=id;
}
public String toString() {
return "" +id;
}
}
//仓库类
class House {
Product[] proArry=new Product[5];//仓库容量
int count=0;//仓库现存产品数量
boolean useIndex=false;//标志此时是否有生产者/消费者正在使用仓库
public synchronized void housein(Product product) throws InterruptedException {
if(count==5) {
this.wait();
}
else if(useIndex) {
this.wait();
}
useIndex=true;
proArry[count]=product;
count++;
useIndex=false;
this.notify();
System.out.println("生产第"+product+"件,现在仓库有"+count+"件");
}
public synchronized Product houseout() throws InterruptedException {
if(count==0) {
this.wait();
}
else if(useIndex) {
this.wait();
}
useIndex=true;
count--;
Product product=proArry[count];
useIndex=false;
this.notify();
System.out.println("消费第"+product+"件,现在仓库有"+count+"件");
return product;
}
}
//生产者
class producer implements Runnable{
House house=null;
producer(House house){
this.house=house;
}
public void run() {
//System.out.println(id+"开始运行");
for(int i=0;i<10;i++) {
try {
Product product=new Product(i+1);
//System.out.println("生产者"+"开始运行");
house.housein(product);
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//消费者
class customer implements Runnable{
House house=null;
customer(House house){
this.house=house;
}
public void run() {
//System.out.println(id+"开始运行");
for(int i=0;i<10;i++) {
try {
//System.out.println("消费者"+i+"开始运行");
house.houseout();
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
效果截图
|