java实现:《操作系统实验一》:模拟管程解决解决生产者-消费者问题

模拟管程解决解决生产者-消费者问题

在利用管程方法来解决生产者-消费者问题时,首先便是为它
们建立一个管程,并命名为procducerconsumer,或简称为
PC。
• 其中包括两个过程:
• (1) put(x)过程。
• (2) get(x)过程。

java实现:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Main {
    
    
	public static void main(String[] args) {
    
    
		Main main=new Main();
		Producer_Customer p_c=main.new Producer_Customer();
		
		Producer p=main.new Producer(p_c);
		Customer c=main.new Customer(p_c);
		
		p.start();
		c.start();
	}
	
	class Producer_Customer{
    
    
		public static final int bufferSize=20;
		private int count;
		private Lock lock;
		private Condition notFull;
	    private Condition notEmpty;
	    
	    public Producer_Customer() {
    
    
	            this.count = 0;
	            this.lock = new ReentrantLock();
	            this.notEmpty = lock.newCondition();
	            this.notFull = lock.newCondition();
	        }
	    //put过程
	    public void put() {
    
    
	    	lock.lock();
	        while(count == bufferSize){
    
    
	            try {
    
    
	                notFull.await();
	            } catch (InterruptedException e) {
    
    
	                e.printStackTrace();
	            }
	        }
	        count++;
	        System.out.println("放入第"+count+"号缓冲区");
	        notEmpty.signal();
	        lock.unlock();
	    }
	    //get过程
	    public void get() {
    
    
	    	lock.lock();
	        while(count == 0){
    
    
	            try {
    
    
	                notEmpty.await();
	            } catch (InterruptedException e) {
    
    
	                e.printStackTrace();
	            }
	        }
	        count--;
	        System.out.println("从第"+ count+"号缓冲区拿出");
	        notFull.signal();
	        lock.unlock();
	    }
	}
	/**
	 * 生产者
	 */
	class Producer extends Thread{
    
    
		private Producer_Customer p_c;
		public Producer(Producer_Customer p_c) {
    
    
			this.p_c=p_c;
		}
		@Override
		public void run() {
    
    
			while(true) {
    
    
				p_c.put();
			}
		}
	}
	/**
	 * 消费者
	 */
	class Customer extends Thread{
    
    
		private Producer_Customer p_c;
		public Customer(Producer_Customer p_c) {
    
    
			this.p_c=p_c;
		}
		@Override
		public void run() {
    
    
			while(true) {
    
    
				p_c.get();
			}
		}
	}
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45273552/article/details/109059666