java实现
/*
* 生产消费者模式
*/
//该类表示的是生产的物品面包
class Bread{
//当前面包的一个标号
private int Id;
//使用构造方法赋值
public Bread(int Id){
this.Id = Id;
}
//当前面包的详细信息
public String toString(){
return "这是第"+Id+"个面包";
}
}
//表示生产的面包的物品
class myStack{
//将面包放到数组中
private Bread[] arr = new Bread[10];
//当前所放面包的一个指针表示当前的位置
private int index = 0;
//生产面包
public synchronized void push(Bread bread){
//当生产的面包超出生产工具时,让该线程释放锁处于等待的一个状态
if(index == arr.length){
try{
this.wait();
}catch(Exception e){
System.out.println("超出生产范围");
}
}
//唤醒正在等待的线程
this.notify();
//将生产的面包放到数组中
arr[index] = bread;
//将当前的指针移动到下一个位置
index++;
try{
Thread.sleep(1000);
System.out.println("生产了"+bread);
}catch(Exception e){
System.out.println("中断异常");
}
}
//消费面包
public synchronized Bread pop(){
//当数组中没有面包时,让该线程处于等待状态,并且释放锁
if(index==0){
try{
this.wait();
}catch(Exception e){
System.out.println("超出生产范围");
}
}
//唤醒真在等待的线程
this.notify();
//将当前指针的位置移动到上一个
index--;
try{
Thread.sleep(1000);
System.out.println("消费了"+arr[index]);
}catch(Exception e){
System.out.println("中断异常");
}
//显示当前的面包
return arr[index];
}
}
//生产者
class Producer implements Runnable{
private myStack mystack = null;
public Producer(myStack mystack){
this.mystack = mystack;
}
//生产者生产20个面包
public void run(){
for(int i=1;i<20;i++){
Bread bread = new Bread(i);
mystack.push(bread);
}
}
}
//消费者
class Consumer implements Runnable{
private myStack mystack = null;
public Consumer(myStack mystack){
this.mystack = mystack;
}
//消费者消费20个面包
public void run(){
for(int i=0;i<20;i++){
mystack.pop();
}
}
}
//测试类
public class Demo{
public static void main(String[] args){
myStack stack = new myStack();
Producer producer = new Producer(stack);
Consumer consumer = new Consumer(stack);
new Thread(producer).start();
new Thread(consumer).start();
}
}
网友评论