单生产者-----------单消费者

父亲生产苹果,女儿消费苹果,当盘子中没有苹果的时候父亲生产,女儿只能等待,当盘子中有苹果的还是父亲等待女儿消费

package com.cc.day16;

public class Demo01 {

	public static void main(String[] args) {
		Apple a = new Apple();
		Producer pro = new Producer(a);
		Consumer con = new Consumer(a);
		Thread pro_t = new Thread(pro,"父亲");
		Thread con_t = new Thread(con,"女儿");
		pro_t.start();
		con_t.start();
	}

}
//定义一个类,描述消费的产品
class Apple{
	//定义公共的变量
	public String name;
	public int count = 1;
	//flag主要作为wait和notify的判断标记
	public boolean flag = false;
}
//生产者
class Producer implements Runnable{
	//声明一个Apple类型
	private Apple a ;
	Producer(Apple a){
		this.a = a;
	}
	//定义生产的名字
	public void produce(String name) {
		a.name = name+a.count;
		a.count++;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			synchronized(Apple.class) {//锁对象可以是任意的对象,只要保证生产者和消费者以及wait和notify的锁对象一致即可
				if(a.flag) {//a.flag==true,代表盘子里有苹果,不可以生产,需要等待
					try {
						Apple.class.wait();//wait()前面不加锁对象就会出现异常//java.lang.IllegalMonitorStateException
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				produce("苹果");//一定得记得生产,不生产女儿吃什么,不生产的话,名字就全部为null
				System.out.println(Thread.currentThread().getName()+"削好了"+a.name);
				try {//我也不晓得为啥必须要休息,不然苹果数就不是从1开始,可能是消费者消费需要时间,???
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				a.flag=true;//改变标志
				Apple.class.notify();//唤醒生产者
			}
		}
	}
	
}
class Consumer implements Runnable{
	Apple a;
	Consumer(Apple a){
		this.a = a;
	}
	//定义消费的方法,返回苹果的名字
	public String consume() {
		return a.name;
	}
	@Override
	public void run() {
		while(true) {
			synchronized (Apple.class) {
				if(!a.flag) {
					try {
						Apple.class.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				System.out.println(Thread.currentThread().getName()+"拿走了"+consume());
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				a.flag=false;
				Apple.class.notify();
			}
		}
	}
	
}

【运行结果】

父亲生产苹果1

女儿消费了苹果1

父亲生产苹果2

女儿消费了苹果2

父亲生产苹果3

女儿消费了苹果3

父亲生产苹果4

女儿消费了苹果4

父亲生产苹果5

女儿消费了苹果5

父亲生产苹果6

女儿消费了苹果6

父亲生产苹果7

女儿消费了苹果7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生产者-消费者算法是一种经典的进程同步算法,用于解决生产者消费者之间的同步和互斥问题。在该算法中,生产者进程负责向缓冲池中生产产品,而消费者进程则负责从缓冲池中消费产品。为了保证生产者消费者之间的同步和互斥,需要使用互斥锁和条件变量来实现。 在C++中,可以通过定义生产者消费者类来实现生产者-消费者算法的模拟。在这些类中,可以定义一个缓冲池,用于存储生产者生产的产品,并且使用互斥锁来保证对缓冲池的互斥访问。同时,还需要定义一个条件变量,用于在缓冲池为空或者已满时进行等待和唤醒操作。 在生产者类中,可以定义一个生产函数,用于向缓冲池中添加产品。在该函数中,需要先获取互斥锁,然后判断缓冲池是否已满,如果已满则等待条件变量,否则向缓冲池中添加产品,并且唤醒等待在条件变量上的消费者进程。最后,释放互斥锁。 在消费者类中,可以定义一个消费函数,用于从缓冲池中消费产品。在该函数中,需要先获取互斥锁,然后判断缓冲池是否为空,如果为空则等待条件变量,否则从缓冲池中取出产品,并且唤醒等待在条件变量上的生产者进程。最后,释放互斥锁。 在主函数中,可以创建一个生产者对象和一个消费者对象,并且循环调用它们的生产和消费函数,以模拟生产者-消费者算法的运行过程。每次调用后,可以输出缓冲池的产品状态和数量,以便观察算法的运行情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值