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阻塞队列实现生产者和消费者模式