线程-生产者消费者问题

此文章的目的在于利用线程的互斥,解决生产者消费者问题。其中使用了关键字sychronized。

线程的内容可以一样,但是对应不同的内存地址。运行起来相互独立,是两个完全独立的进程。

producer.java文件:

package ProducerConsumer;
class Producer extends Thread
{
  CircularBuffer cbp=null;
 
 
 Producer(CircularBuffer cb){cbp=cb;}
 public void run(){
  for(int i=0;i<=50000;i++)
  try{
   cbp.put(i);
  }
  catch (Exception err){
   //System.
   
   }
  
  }
 // public static void main(String[] args) {}
}

ProCum文件:

package ProducerConsumer;
import java.io.*;
class ProCum{


 public static void main(String[] args){
 
 CircularBuffer cb=new CircularBuffer(20);
 
 //因为要调用的两个方法put和get是排斥,所以调用时由同一个对象调用,所以
 //都是cb,注意注意!!!!!!
 
 Producer pro=new Producer(cb);
 Consumer con=new Consumer(cb);
// 
 Thread a=null;
 Thread b=null;
  
  a=new Thread(pro);
  
  b=new Thread(con);
  b.start();
  a.start();
 
  }
 }

Consumer.java文件:

package ProducerConsumer;
class Consumer extends Thread
{
 CircularBuffer cbc=null;
 
 
 Consumer(CircularBuffer cb)
 {cbc=cb;}
 public void run(){
  for(int i=0;i<=50000;i++)
  try{
   cbc.get();
  }
  catch (Exception err){
   
   }
  
  }
 
}

CircularBuffer.java 文件:

package ProducerConsumer;
import java.io.*;
class CircularBuffer
{
 int bufsize;
 int[] store;
 int numOfEntries=0;
 int front=0;
 int back=0;
 
 CircularBuffer(int n)
 {
  bufsize=n;
  store=new int[bufsize];
 
 }
 synchronized void put(int obj)throws Exception{
  if(numOfEntries==bufsize) 
  {
   System.out.println("Producer waiting");
   
   wait();
   
  }
  store[back]=obj;
  back++;
  if(back==bufsize)  back=0;
  else {numOfEntries++;
  System.out.println("putting   "+   obj);
 
  notify();
 }
  
 }
 
 synchronized int get() throws Exception{
  int result=0;
  if(numOfEntries==0)
  {
   System.out.println("Consumer waiting");
   wait(); 
  }  
 
  else{
   result=store[front];
   front++;
   if(front==bufsize) front=0;
   
   
   
    numOfEntries--;
   System.out.println("getting   "+result);//;
   notify();
}
  return result;
  
  
  
 }
 
 public static void main(String[] args)
 {
}
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值