生产者消费者

题目大意 :

我有生产者和消费者 。规定我只有一个盘子 ,要求生产者生产完毕,消费者才能去消费。消费者消费完毕,生产者才能去生产。

且开始时必须要求是生产者先进行生产

消费者:

package com.candp;

public class Consumer implements Runnable{
	
	public Goods good;
	
	public Consumer(Goods good1) {
		this.good = good1;
	}

	@Override
	public void run() {
		while(true) {//模拟线程不断执行
		synchronized(good) {
			
			if( !good.flag) {//若flag为true,说明我的盘子里面已经有东西
				try {
					good.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			try {
				Thread.sleep(1000);
				System.out.println("消费水果需要1S");
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
				System.out.println("消费者消费了 "+ good.get());
				
				//此时我已经消费完毕,我需要将盘子置为空
				good.flag = false;
				good.notify();//唤醒等待线程
		  }
		
		}
		
	}
	
	

}

生产者

package com.candp;

public class Product implements Runnable{

	public Goods good ;
	public Product(Goods good1) {
		this.good = good1;
	}
	
	int i = 0;
	@Override
	public void run() {
		
		while(true) {
			
			synchronized(good) {
	
					if(good.flag) {//若为true,说明我盘子里面有东西,生产者需要进行等待
						try {
							good.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					
					try {
						Thread.sleep(2000);
						System.out.println("生产水果需要2S");
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					//到这里说明flag为false,生茶者可以进行生产
					
					if(i%2 == 0) {//为偶数时我生产苹果
						good.setName("苹果");	
					}else {
						good.setName("香蕉");//为奇数时我生产香蕉
					}
					System.out.println("生产者生产了"+good.get());
					i++;
					
					//我生产完毕了
					good.flag = true;//此时我应该将盘子的标记置为true说明盘子里面有东西
					good.notify();//若生产者线程在等待我就去唤醒它
					
				}
		}
		
	}
	

}

产品:

package com.candp;

public class Goods {
	
	private String name;//商品的名称
	
	public boolean flag = false;//设置flag
	
	public Goods() {
		
	}
	
	public String get() {
		return this.name;
	}
	
	public void setName(String name1) {
		this.name = name1;
	}

}

实现类:

package com.candp;

public class Demo {
	
	public static void main(String[] args) {
		Goods good = new Goods();
		
		//创建生产者线程目标执行对象
		Product p = new Product(good);
		Thread t1 = new Thread(p);
		t1.start();
		
		//创建消费者线程目标执行对象
		Consumer s = new Consumer(good);
		Thread t2 = new Thread(s);
		t2.start();
		
	}

}

注 : 使用Runnable实现类去共同竞争资源时。把共享的资源作为对象添加到Runnable实现类里面。这样可以达到资源共享的目的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值