java线程 案例:生产者与消费者


class Box{
	private int milk;
	private boolean state=false;
	public synchronized void put(int milk)  {//同步代码块:执行这块代码后,所在线程加锁,不会被抢占使用权。
		                                     //这时其他线程要执行,需要wait()该线程,notify()其他线程
		if(state) {  //有奶,不再继续放,put的线程暂停,等待get线程拿出奶
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//state=false,没有奶,生产者放入奶,这是第i瓶
		this.milk=milk;
		System.out.println("生产者放入第"+this.milk+"瓶奶");
		state=true;   //有了奶,奶箱不为空,修改奶箱状态
		notifyAll();  //唤醒其他所有线程(唤醒get线程,取出牛奶)
	}
	public synchronized void get()  {
		if(!state) {  //state=false,没有奶,消费者没法拿出奶,只能等待
			try {
				wait();  //消费者的get行为/线程开始等待
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//state=true,有奶,可以拿出,这是第i瓶奶
		System.out.println("消费者拿出第"+this.milk+"瓶奶");
		state=false; //拿出以后,box空,修改box状态
		notifyAll();  //唤醒其他所有线程(唤醒put线程,开始放入)
	}
}

class Producer implements Runnable{
	private Box b;
	public Producer(Box b) {
		this.b=b;
	}
	@Override
	public void run() {
		for(int i=1;i<11;i++) {
			b.put(i);
		}
	}
   
}

class Customer implements Runnable{
	private Box b;
	public Customer(Box b) {
		this.b=b;
    }
	@Override
	public void run() {
		while(true) {
			b.get();
		}
	}
}

public class Milk {
	public static void main(String[] args) {
		Box b=new Box();    //创建一个奶箱
		Producer p=new Producer(b);  //都用这个奶箱
		Customer c=new Customer(b);
		Thread t1=new Thread(p);    //producer在线程1中
		Thread t2=new Thread(c);    //customer在线程2中
		t1.start();
		t2.start();
		
	}
}

案例:生产者每天生产一瓶奶,放入奶箱,消费者拿出奶后,生产者再生产,放入

思路:四个类

1.Box:奶箱

2.Producer:生产者,实现Runnable接口,put()存放操作

3.Customer:消费者,实现Runnable接口,get()取出操作

4.Demo:主类,main,创建Box、producer、customer、Thread,开启线程

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值