利用信号量操作系统经典同步问题生产者和消费者

解决生产者和消费者的同步与互斥问题
在这里插入图片描述

package Test;

import java.util.concurrent.Semaphore;

public class ProducerandConsumer {
	public static void main(String[] args) {
		Warehouse warehouse =new Warehouse();
		
		Producer p1 = new Producer(warehouse,"生产者A");
		Producer p2 = new Producer(warehouse,"生产者B");
		Producer p3 = new Producer(warehouse,"生产者B");
		
		Consumer c1 = new Consumer(warehouse,"消费者A");
		Consumer c2 = new Consumer(warehouse,"消费者B");
		Consumer c3 = new Consumer(warehouse,"消费者C");
		
		p1.start();
		p2.start();
		p3.start();
		
		c1.start();
		c2.start();
		c3.start();
		
		
		
	}
}

class Sem{
	public static final Semaphore PMUTEX = new Semaphore(1);//生产者互斥
	public static final Semaphore CMUTEX = new Semaphore(1);//消费者互斥
	public static final Semaphore Capacity = new Semaphore(10);//仓库中的位置数量
	public static final Semaphore ProductSum = new Semaphore(0);//仓库中的产品数
	
}

class Warehouse{
	int[] rack = new int[10];//表示初始的十个货架
	private int put_index=0;//从第一个位置放产品
	private int get_index=0;//从第一个位置取产品
	public void put(int data) {
		rack[put_index]=data;
		System.out.println(Thread.currentThread().getName()+"向"+put_index+"放置产品"+data);
		put_index=(put_index+1)%rack.length;//放置的位置后移
	}
	public int get() {
		int data = rack[get_index];
		System.out.println("\t\t\t"+Thread.currentThread().getName()+"从仓库"+get_index+"取出产品"+data);
		get_index=(get_index+1)%rack.length;
		return data;
	}
}

class Producer extends Thread {
	private Warehouse warehouse;
	public Producer(Warehouse warehouse,String name) { 
		super(name);
		this.warehouse=warehouse;
	}
	public void run() {
		while(true) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//1.生产产品
			int data = (int)(Math.random()*1000);
			try {
				Sem.Capacity.acquire();//P(Capacity)
				Sem.PMUTEX.acquire();//P(PMUTEX)
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			//2.把产品放入仓库
			warehouse.put(data);
			Sem.PMUTEX.release();//V(PMUTEX)
			Sem.ProductSum.release();//V(ProductSum)
		}
	}
}

class Consumer extends Thread {
	private Warehouse warehouse;
	public Consumer(Warehouse warehouse,String name) {
		super(name);
		this.warehouse=warehouse;
	}
	public void run() {
		while(true) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//1.从仓库取出产品
			try {
				Sem.ProductSum.acquire();//P(ProductSum)
				Sem.CMUTEX.acquire();//P(CMUTEX)
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			int data = warehouse.get();
			
			 Sem.CMUTEX.release();//V(CMUTEX)
			 Sem.Capacity.release();//V(Capacity)
			
			//2.产品消费
			//do something to consume;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值