java多线程 生产者消费者

package com.atguigu.thread;

/*
 * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,
 * 店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,
 * 如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,
 * 如果店中有产品了再通知消费者来取走产品。
 * 生产者和消费者线程,如果都各有一个,那么唤醒的时候可以使用notify()唤醒,因为只有一个线程等待唤醒。
 * 但是如果生产者和消费者线程是多个,那么使用notify()唤醒就会随机唤醒,就有肯能造成错误,这个时候需要使用notifyAll()。
 * 需要将原来使用if判断的wait判断块改成使用while判断。
 */
public class TestClerk {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Clerk clerk = new Clerk();
		Productor p = new Productor(clerk);
		Productor p1 = new Productor(clerk);
		Productor p2 = new Productor(clerk);
		p.start();
		p1.start();
		p2.start();
		Customer c = new Customer(clerk);
		Customer c1 = new Customer(clerk);
		Customer c2 = new Customer(clerk);
		c.start();
		c1.start();
		c2.start();

	}

}

class Clerk {
	private int product = 20;

	public int getProduct() {
		return product;
	}

	public void setProduct(int product) {
		this.product = product;
	}

	// 保存一个商品
	public synchronized void save() {
		//if(product >= 20){//只有一个消费线程的时候可以使用if判断。
		while(product >= 20){//有多个消费线程的时候需要使用while。
			System.out.println("现在商品已经达到上限,先让消费线程消费一会儿吧~~~~~~~~~~~~~~~~");
			try {
				this.wait();//当前线程进入等待状态
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		product++;
		System.out.println("生产线程生产了一个商品,此时商品数量是:" + getProduct());
		//this.notify();//唤醒另外一个线程。
		this.notifyAll();//唤醒所有线程。
	}

	// 消费一个商品
	public synchronized void get() {
		//if(product <= 0){//只有一个生产线程的时候可以使用if
		while(product <= 0){//有多个生产线程的时候需要是while
			System.out.println("当前已经没有任何商品了,让生产线程生产一会儿吧======================");
			try {
				this.wait();//当前线程进入等待状态
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		product--;
		System.out.println("消费线程消费了一个商品,此时商品数量是:" +getProduct());
		//this.notify();//唤醒另外一个线程。
		this.notifyAll();//唤醒所有线程
	}

}

class Productor extends Thread {
	private Clerk clerk;

	public Productor(Clerk clerk) {
		super();
		this.clerk = clerk;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			clerk.save();
		}
	}

}

class Customer extends Thread {
	private Clerk clerk;

	public Customer(Clerk clerk) {
		super();
		this.clerk = clerk;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			clerk.get();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值