多线程的使用场景;
期望值是:
送奶工 放入第1瓶 消费者 消费 第1瓶
送奶工 放入第2瓶 消费者 消费 第2瓶
送奶工 放入第3瓶 消费者 消费 第3瓶
送奶工 放入第4瓶 消费者 消费 第4瓶
送奶工 放入第5瓶 消费者 消费 第5瓶
生产者与消费者的模式(使用多线程的)
多线程的模式有两种,比如:
1、售票案例—都是消费者线程(线程种类是同一种)
2、卖包子,喝牛奶(不同的线程种类)
生成者(一个种类)
消费者(一个种类)
使用的思想是:生产者先生产出一个商品,然后消费者再去消费。
喝牛奶案例:
package demo03;
public class Box {
private int milk;
private boolean state=false;
public synchronized void put(int milk) {
if(state) {//if(state==true)默认是这样的写法
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.milk=milk;
System.out.println("生产者正在往奶箱送第"+this.milk+"瓶牛奶");
state=true;
notifyAll();
}
//到这里就是state为true;
public synchronized void get() {
while (true) {
if (!state) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消费者正在从奶箱中拿第" + this.milk + "牛奶");
state = false;
notifyAll();
}
}
}
package demo03;
public class Consumer implements Runnable{
private Box box;
public Consumer() {
}
public Consumer(Box box) {
this.box = box;
}
@Override
public synchronized void run() {
box.get();
}
}
package demo03;
public class Producer implements Runnable {
private Box box;
public Producer() {
}
public Producer(Box box) {
this.box = box;
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
box.put(i);
}
}
}
package demo03;
public class Test01 {
public static void main(String[] args) {
Box box=new Box();
Producer p=new Producer(box);
Thread t=new Thread(p);
t.start();
Consumer c=new Consumer(box);
Thread t1=new Thread(c);
t1.start();
}
}
运行结果如下所示: