Java多线程并发之生产者和消费者模式使用wait()和notify()通信方法实现

1、简介:

生产者和消费者模式生活当中随处可见,它描述的是协调与协作的关系。比如餐厅厨师在准备食物,那么厨师就是生产者,而来店里吃饭的客户则是消费者,消费者需要座子和椅子这就是公共的一个空间,在代码里座子和椅子则就是一个共享的对象。

2、需求

生产者:指的是生产好某样东西放在一个公共的空间里,这里指的是放到餐盒里
消费者:指的是从公共的空间里取出生产好的东西,这里指的是从餐盒里取餐
餐盒:这里我对餐盒的容量的定义是不能超过五个

3、餐盒代码类

/**
 * 存放餐的盒子 盒子这里固定大小为五个
 * @author 小轩
 *
 */
public class Box {
	//餐的数量初始化为0
	private int meal = 0;
	
	//厨师制作一份餐
	public synchronized void create(){
		//如果餐等于5即可等待消费少于5份的再生产
		while (meal==5) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		meal++;
		System.out.println("制作一份餐成功");
		//唤醒等待的线程
		notify();
	}
	
	//消费者购买一份餐
	public synchronized void buy(){
		//如果餐等于0份的时候 即代表等待生产线程去生产
		while (meal==0) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		meal--;
		System.out.println("消费一份餐成功");
		//唤醒等待的线程
		notify();
	}
}

4、生产者代码类 (这里定义生产10次)

/**
 * 生产者
 * @author 小轩
 *
 */
public class Producter implements Runnable {
	private Box box;
	public Producter(Box box) {
		// TODO Auto-generated constructor stub
		this.box = box;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) {
			System.out.println("生产者 i:"+(i+1));
			try {
				Thread.sleep(30);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			box.create();
		}
	}

}

5、消费者代码类 (这里定义消费10次)

/**
 * 消费者
 * @author 小轩
 *
 */
public class Consumer implements Runnable{
	private Box box;
	public Consumer(Box box) {
		// TODO Auto-generated constructor stub
		this.box = box;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) {
			System.out.println("消费者 i:"+(i+1));
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			box.buy();
		}
	}

}

6、主程序类

public class Test {

	/**
	 * 主程序入口
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//实例化盒子
		Box box = new Box();
		//实例化生产者并且把盒子传递过去 用的是同一个盒子
		Producter pro = new Producter(box);
		//实例化消费者并且把盒子传递过去 用的也是同一个盒子
		Consumer con = new Consumer(box);
		//实例化两个线程
		Thread t1 = new Thread(pro);
		Thread t2 = new Thread(con);
		//启动两个线程
		t1.start();
		t2.start();
	}
}

7、运行主程序类效果

在这里插入图片描述

8、这里推荐使用阻塞队列实现生产者和消费者模式

阻塞队列实现生产者消费者模式超级简单,它提供开箱即用支持阻塞的方法put()和take(),开发者不需要写困惑的wait-nofity代码去实现通信。BlockingQueue 一个接口,Java5提供了不同的现实,如ArrayBlockingQueue和LinkedBlockingQueue,两者都是先进先出(FIFO)顺序。而ArrayLinkedQueue是自然有界的,LinkedBlockingQueue可选的边界。

点击跳转----》 Java多线程并发采用BlockingQueue阻塞队列实现生产者和消费者模式

9、遇到困难可以评论(有信必回)小轩微信17382121839。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章