消费者等待生产者生产产品,造多了就不造了,少了就去生产。
抽取对象:消费者 生产者 电商
天猫:
package com.roocon.thread.ta7;
public class Tmall {
private int count;
public final int MAX_COUNT = 10;
public synchronized void push () {
while(count >= MAX_COUNT) {
try {
System.out.println(Thread.currentThread().getName() + " 库存数量达到上限,生产者停止生产。");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count ++;
System.out.println(Thread.currentThread().getName() + " 生产者生产,当前库存为:" + count);
notifyAll();
}
public synchronized void take () {
while(count <= 0) {
try {
System.out.println(Thread.currentThread().getName() + " 库存数量为零,消费者等待。");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count --;
System.out.println(Thread.currentThread().getName() + " 消费者消费,当前库存为:" + count);
notifyAll();
}
}
不断的生产调用方法,这里不写逻辑知识调用:
package com.roocon.thread.ta7;
public class PushTarget implements Runnable {
private Tmall tmall;
public PushTarget(Tmall tmall) {
this.tmall = tmall;
}
@Override
public void run() {
while(true) {
tmall.push();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
不断的消费
package com.roocon.thread.ta7;
public class TakeTarget implements Runnable {
private Tmall tmall;
public TakeTarget(Tmall tmall) {
this.tmall = tmall;
}
@Override
public void run() {
while(true) {
tmall.take();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
main方法:
package com.roocon.thread.ta7;
public class Main {
public static void main(String[] args) {
Tmall tmall = new Tmall();
PushTarget p = new PushTarget(tmall);
TakeTarget t = new TakeTarget(tmall);
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
注意点关于if和while的:
notifyAll之后所有在wait等待的线程都会被唤醒的。非线程安全的执行count++;
if换为while
为什么?https://blog.csdn.net/worldchinalee/article/details/83790790
不wait的话就要去消费的。
----------------------ta7------------------------