• java模拟实现生产者---消费者问题


    本文章为小编原创,请尊重文章的原创性,转载请注意写明转载来源:http://blog.csdn.net/u012116457


    已知技术參数:
    生产者消费者问题,描写叙述一组生产者向一组消费者提供产品/消息。它们共享一个有界缓冲区,生产者向当中放产品/消息,消费者从中取产品/消息。仅仅要缓冲区未满,生产者可放产品/消息,仅仅要缓冲区有数据。消费者可取消息。

    即应满足下列二个同步条件:
    1.仅仅有在缓冲池中至少有一个缓冲区已存入消息后,消费者才干从中提取消息。否则消费者必须等待。
    2.仅仅有缓冲池中至少有一个缓冲区是空时,生产者才干把消息放入缓冲区,否则生产者必须等待。

    设计要求:
    要求设定一个缓冲池中有n个缓冲区。每一个缓冲区存放一个消息。创建多个生产者,消费者,并在每一个生产者消费者创建时、发出放/取产品申请时、正在放/取产品时和放/取产品结束时分别给出提示信息。并显示取/方产品前后的缓冲区状态。以检查全部处理都遵守对应的操作限制。


    上代码:

    最核心的代码:

    package kcsj;
    /**
     * 模拟实现生产者--消费者问题
     * 
     * @date 2014/06/24
     *
     */
    public class ProductiveConsumption {
    	private int front=0;             //队头
    	private int next=0;              //队尾
    	private int bufferLength;        //缓冲区大小
    	private String buffer[];         //缓冲区
    	private int emptyNum;          //空缓冲区数目
    	public ProductiveConsumption(int bufferLength){
    		this.bufferLength=bufferLength;
    		buffer=new String[bufferLength];
    		emptyNum=bufferLength;
    	}
    	//生产
    	public synchronized void produce(String data){
    		System.out.println("生产前,空缓冲区数目-----------"+emptyNum);
    		System.out.println("***生产者正在生产"+data);
    		while(full()){
    			System.out.println("*****缓冲池已满,生产等待");
    			try {
    				this.wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		this.notify();
    		buffer[next]=data;
    		next=(next+1)%bufferLength;
    		System.out.println("****生产者成功生产:"+data);
    		emptyNum--;
    		System.out.println("生产后,空缓冲区数目-----------"+emptyNum);
    	}
    	//消费
    	public synchronized void consum(){
    		System.out.println("消费前,空缓冲区数目-----------"+emptyNum);
    		while(empty()){
    			System.out.println("*****缓冲池为空,消费等待");
    			try {
    				this.wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		System.out.println("***消费者正在消费"+buffer[front]);
    		this.notify();
    		System.out.println("****消费者成功消费:"+buffer[front]);
    		front=(front+1)%bufferLength;
    		emptyNum++;
    		System.out.println("消费后,空缓冲区数目-----------"+emptyNum);
    	}
    	//缓冲池是否已满
    	public boolean full(){
    		if(emptyNum==0){
    			return true;
    		}
    		return false;
    	}
    	//缓冲池是否为空
    	public boolean empty(){
    		if(bufferLength==emptyNum){
    			return true;
    		}
    		return false;
    	}
    
    }
    



    其它辅助代码:

    package kcsj;
    /**
     *创建生产者
     */ 
    public class CreateProducer implements Runnable{
    	ProductiveConsumption pc;
    	int producerNum;
    	public CreateProducer(ProductiveConsumption pc,int producerNum){
    		this.pc=pc;
    		this.producerNum=producerNum;
    	} 
    	public void run(){
    		for(int i=0;i<producerNum;i++){
    			Producer producer=new Producer(pc);
    			try {
    				Thread.sleep((int)(Math.random()*100));
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			} 
    		}
    	}
    }
    

    package kcsj;
    /**
     *创建消费者
     */ 
    public class CreateConsumer implements Runnable{
    	ProductiveConsumption pc;
    	int consumerNum;
    	public CreateConsumer(ProductiveConsumption pc,int consumerNum){
    		this.pc=pc;
    		this.consumerNum=consumerNum;
    	} 
    	public void run(){
    		for(int i=0;i<consumerNum;i++){
    			Consumer consumer=new Consumer(pc);
    			try {
    				Thread.sleep((int)(Math.random()*100));
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			} 
    		}
    	}
    }
    

    package kcsj;
    
    public class Producer{
    	ProductiveConsumption pc;
    	public Producer(ProductiveConsumption pc){
    		this.pc=pc;
    		System.out.println("*成功创建一个生产者");
    		apply();
    	} 
    	public void apply(){
    		char c=(char)(Math.random()*26+'A');  
    		String data=String.valueOf(c);
    		System.out.println("**生产者发出请求");
    		pc.produce(data);
    	}
    
    }
    

    package kcsj;
    
    public class Consumer{
    	ProductiveConsumption pc;
    	public Consumer(ProductiveConsumption pc){
    		this.pc=pc;
    		System.out.println("*成功创建一个消费者");
    		apply();
    	} 
    	public void apply() {
    		System.out.println("**消费者发出请求");
    		pc.consum();
    	}
    }
    

    package kcsj;
    
    import java.util.Scanner;
    
    public class Test {
    
    	public static void main(String[] args) {
    		Scanner sc=new Scanner(System.in);
    		System.out.println("输入缓冲区大小");
    		int buffLength=sc.nextInt();
    		System.out.println("输入生产者和消费者个数");
    		int prodecerNum=sc.nextInt();
    		int consumerNum=sc.nextInt();
    
    		ProductiveConsumption pc=new ProductiveConsumption(buffLength); 
    		Runnable cp=new CreateProducer(pc,prodecerNum); 
    		Runnable cc=new CreateConsumer(pc,consumerNum); 
    		Thread t1=new Thread(cp); 
    		Thread t2=new Thread(cc);
    		t1.start(); 
    		t2.start(); 
    	}
    }
    


  • 相关阅读:
    张旭结对编程作业
    团队第一次作业(软工C#造梦厂)
    张旭第二次作业
    跨域问题
    .Net Core3.1使用AspectCore
    .Net中HttpClient之SendAsync方法
    两个具有相同属性的类赋值
    工具类--HttpUtils
    工具类--CacheHelper
    工具类--JsonHelper
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5168161.html
Copyright © 2020-2023  润新知