多线程通信(生产者,消费者问题)

理解多线程通信,就是要用多线程需要有一个共同的共享资源,通过该共享资源完成线程的通信。
实例:工厂——消费者——产品
工厂生产产品,消费者消费产品,产品就成了两者之间的共享资源
产品的成员属性:产品名,产品价格,是否需要生产的标识

public class Goods{
	private String name;
	private float price;
	private boolean product;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public boolean isProduct() {
		return product;
	}
	public void setProduct(boolean product) {
		this.product = product;
	}
	public Goods() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Goods(String name, float price, boolean product) {
		super();
		this.name = name;
		this.price = price;
		this.product = product;
	}
	
	
}

工厂根据是否需要生产的标识来生产产品
1.判断是否需要生产
如果需要生产,就修改生产标识,唤醒消费者线程,如果不需要生产,就进入无限等待状态,等候被唤醒

public class Produce implements Runnable {
	private Goods goods = null;

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			synchronized (goods) {
				
			
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		//需要生产
		if (goods.isProduct()) {
			if (Math.random() > 0.5) {
				goods.setName("擀面皮");
				goods.setPrice(6.0F);
			}else {
				goods.setName("烤羊排");
				goods.setPrice(128);
			}
			//修改标记
			goods.setProduct(false);
			System.out.println("生产者生产了"+goods.getName()+":"+goods.getPrice());
			//唤醒消费者
			goods.notify();
			System.out.println("需要唤醒消费者消费");

		}
		else {
			//生产者进人无限等待状态
			System.out.println("生产者进入无限等待");
			try {
				goods.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		}
		}
	}

	public Produce(Goods goods) {
		super();
		this.goods = goods;
	}

}

消费者消费判断生产标识,不需要生产代表可以消费,消费了就要修改生产标识,唤醒生产者进程,如果需要生产那么,消费者进程就进入无限等待,等待唤醒

public class Custmor implements Runnable {
	private Goods goods = null;

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
		synchronized (goods) {
		
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		//判断是否可以进行消费
		if(!goods.isProduct()) {
			//更改生产状态
			goods.setProduct(true);
			System.out.println("消费者消费了"+goods.getName()+"花了"+goods.getPrice());
			//唤醒生产者生产
			System.out.println("唤醒生产者");
			goods.notify();
		}
		else {
			//让消费者进入等待
			System.out.println("消费者进入等待");
			try {
				goods.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		}
		}
	}

	public Custmor(Goods goods) {
		super();
		this.goods = goods;
	}

}
发布了8 篇原创文章 · 获赞 0 · 访问量 104

猜你喜欢

转载自blog.csdn.net/Lu_QQ/article/details/104630816