Java线程----生产者消费者模型

大家好,我刚学Java不久,最近刚刚学习了Java的多线程,编写了一个关于生产者消费者模型的程序!贴到这里,希望共同学习一下!由于本人是新手,所以请大家给我提出建议!谢谢!

 

/*
 Java线程间的通信----生产者消费者模型
*/ 

public class ProducerConsumer{
 public static void main(String[] args){
  SyncStack ss=new SyncStack();
  Producer p=new Producer(ss);
  Consumer c=new Consumer(ss);
  new Thread(p).start();
  new Thread(c).start();
   
 } 
}

class Bread{//生产的产品,这里以生产面包为例
 int id;
 Bread(int id){
  this.id=id; 
 } 
}

class SyncStack{//盛面包的容器--栈--先进先出原则
 Bread[] arrBread=new Bread[8];//限制最多能装9个面包
 int index=0;//计数
 
 synchronized public void push(Bread mt){//生产过程
  try{
   while(index==arrBread.length){
    this.wait(); 
   }
   this.notify();
   arrBread[index]=mt;
   index++;
   
  }catch(InterruptedException e){
   e.printStackTrace(); 
  } 
 }
 
 synchronized public  Bread pull (Bread mt){//消费过程
  try{
   while(index==0){
    this.wait(); 
   }
   this.notify();
  }catch(InterruptedException e){
   e.printStackTrace(); 
  }
   
  index--;
  return arrBread[index];  
 }  
}

class Producer implements Runnable {//生产者
 SyncStack ss=null;
 
 Producer(SyncStack ss){
  this.ss=ss; 
 }
 
 public void run(){
  for(int i=0;i<60;i++){//限制最多生产60个
   Bread mt=new Bread(i);
   ss.push(mt);
   System.out.println("生产————>"+i);
   try{
    Thread.sleep((int) (Math.random()*200)); 
   }catch(InterruptedException e){
    e.printStackTrace(); 
   } 
  }
 } 
}

class Consumer implements Runnable{//消费者
 SyncStack ss=null;
 
 Consumer(SyncStack ss){
  this.ss=ss; 
 }
 
 public void run(){
  for(int i=0;i<60;i++){//限制最多消费60个
   Bread mt=new Bread(i);
   ss.pull(mt);
   System.out.println(i+"————>消费");
   try{
    Thread.sleep((int) (Math.random()*1000)); 
   }catch(InterruptedException e){
    e.printStackTrace(); 
   }
  }
 }  
}

 

生产者消费者模型涉及的java知识点还是比较多的,是初学者熟悉知识点的好题目也是一般企业面试的重点题目,其中涉及了类和对象的关系,对象的引用,异常的处理,接口的实现,方法的重写,线程的创建,sleep()应用,wait()和notify()应用,数据结构栈的应用,还有多态的运用!本人认为初学者一定要熟练掌握这个模型!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值