package com.chang.exer;
/**
* 题目:生产者将产品交给店员,消费者从店员处取走产品,店员一次最多只能持有固定数量(20)产品满仓时叫停生产者生产,售出产品后有仓位时通知生产者继续生产;产品售空时通知消费者等待,进货后通知消费者来购买。
* 要求:简单体现多线程执行和通信特点即可。
* <p>
* 分析
* 1. 类:生产者类、店员类、消费者类;类的组合:生产者类{店员类型属性}、消费者类{店员类型属性}
* 2. 线程1:消费者从店员处购买产品,消费线程;线程2:店员从生产者进货产品,进货和生产线程;
* 3. 共享数据:产品数量(声明在店员类属性里,这样可以产生交互);
* 4. 线程通信:线程1产品售空时wait,产品售出时唤醒线程2;线程2满仓时wait,进货时唤醒线程1;
* 5.简化:逐个消费、逐个生产。
*
* @author Cao Longchang
* @create 2022-04-29 17:54
*/
// 测试类
class ProductTest {
public static void main(String[] args) {
Clerk cle1 = new Clerk();
Consumer con1 = new Consumer(cle1);
Consumer con2 = new Consumer(cle1);
Consumer con3 = new Consumer(cle1);
Producer1 pro = new Producer1(cle1);
Thread threadCon1 = new Thread(con1);
Thread threadCon2 = new Thread(con2);
Thread threadCon3 = new Thread(con3);
Thread threadPro = new Thread(pro);
threadCon1.setName("消费者甲");
threadCon2.setName("消费者乙");
threadCon3.setName("消费者丙");
threadPro.setName("生产者");
threadCon1.start();
threadCon2.start();
threadCon3.start();
threadPro.start();
}
}
// 生产者类
class Producer1 implements Runnable {
private Clerk clerk;
public Producer1(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
while (true) {
clerk.produce();
}
}
}
// 店员类
class Clerk {
// 仓位常量
final int POSITION = 20;
// 产品数量
int products = 0;
// 生产、消费产品数量
int countP = 0;
int countC = 0;
synchronized void produce() {
if (products < POSITION) {
countP++;
System.out.println(Thread.currentThread().getName() + "开始生产第" + countP + "个产品");
products++;
System.out.println("库存:" + products);
this.notify();
// 强制阻塞,控制生产频率
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
// 货物满仓,生产线程wait
System.out.println("店员对" + Thread.currentThread().getName() + "说:已满仓,先不生产!");
System.out.println("库存:" + products);
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
synchronized void consumption() {
if (products > 0) {
countC++;
System.out.println(Thread.currentThread().getName() + "开始消费第" + countC + "个产品");
products--;
System.out.println("库存:" + products);
this.notify();
// 强制阻塞,控制消费频率
try {
Thread.sleep(90);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
// 货物售空,消费线程wait
System.out.println("店员对" + Thread.currentThread().getName() + "说:对不起,已售空,请下次再来!");
System.out.println("库存:" + products);
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 消费者类
class Consumer implements Runnable {
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
while (true) {
clerk.consumption();
}
}
}
运行结果:
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第1个产品
库存:1
消费者乙开始消费第1个产品
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第2个产品
库存:1
生产者开始生产第3个产品
库存:2
生产者开始生产第4个产品
库存:3
生产者开始生产第5个产品
库存:4
生产者开始生产第6个产品
库存:5
生产者开始生产第7个产品
库存:6
生产者开始生产第8个产品
库存:7
生产者开始生产第9个产品
库存:8
生产者开始生产第10个产品
库存:9
消费者甲开始消费第2个产品
库存:8
消费者甲开始消费第3个产品
库存:7
消费者甲开始消费第4个产品
库存:6
消费者甲开始消费第5个产品
库存:5
消费者甲开始消费第6个产品
库存:4
消费者甲开始消费第7个产品
库存:3
消费者甲开始消费第8个产品
库存:2
消费者甲开始消费第9个产品
库存:1
消费者甲开始消费第10个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第11个产品
库存:1
生产者开始生产第12个产品
库存:2
生产者开始生产第13个产品
库存:3
生产者开始生产第14个产品
库存:4
生产者开始生产第15个产品
库存:5
生产者开始生产第16个产品
库存:6
生产者开始生产第17个产品
库存:7
生产者开始生产第18个产品
库存:8
生产者开始生产第19个产品
库存:9
生产者开始生产第20个产品
库存:10
生产者开始生产第21个产品
库存:11
生产者开始生产第22个产品
库存:12
生产者开始生产第23个产品
库存:13
生产者开始生产第24个产品
库存:14
生产者开始生产第25个产品
库存:15
生产者开始生产第26个产品
库存:16
生产者开始生产第27个产品
库存:17
生产者开始生产第28个产品
库存:18
生产者开始生产第29个产品
库存:19
生产者开始生产第30个产品
库存:20
店员对生产者说:已满仓,先不生产!
库存:20
消费者甲开始消费第11个产品
库存:19
消费者甲开始消费第12个产品
库存:18
消费者甲开始消费第13个产品
库存:17
消费者甲开始消费第14个产品
库存:16
消费者甲开始消费第15个产品
库存:15
消费者甲开始消费第16个产品
库存:14
消费者甲开始消费第17个产品
库存:13
消费者甲开始消费第18个产品
库存:12
消费者甲开始消费第19个产品
库存:11
消费者甲开始消费第20个产品
库存:10
消费者甲开始消费第21个产品
库存:9
消费者甲开始消费第22个产品
库存:8
消费者甲开始消费第23个产品
库存:7
消费者甲开始消费第24个产品
库存:6
消费者甲开始消费第25个产品
库存:5
消费者甲开始消费第26个产品
库存:4
消费者甲开始消费第27个产品
库存:3
消费者甲开始消费第28个产品
库存:2
消费者甲开始消费第29个产品
库存:1
消费者甲开始消费第30个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第31个产品
库存:1
生产者开始生产第32个产品
库存:2
生产者开始生产第33个产品
库存:3
生产者开始生产第34个产品
库存:4
生产者开始生产第35个产品
库存:5
生产者开始生产第36个产品
库存:6
生产者开始生产第37个产品
库存:7
生产者开始生产第38个产品
库存:8
生产者开始生产第39个产品
库存:9
生产者开始生产第40个产品
库存:10
生产者开始生产第41个产品
库存:11
生产者开始生产第42个产品
库存:12
生产者开始生产第43个产品
库存:13
生产者开始生产第44个产品
库存:14
生产者开始生产第45个产品
库存:15
生产者开始生产第46个产品
库存:16
生产者开始生产第47个产品
库存:17
生产者开始生产第48个产品
库存:18
生产者开始生产第49个产品
库存:19
生产者开始生产第50个产品
库存:20
店员对生产者说:已满仓,先不生产!
库存:20
消费者甲开始消费第31个产品
库存:19
消费者甲开始消费第32个产品
库存:18
消费者甲开始消费第33个产品
库存:17
消费者甲开始消费第34个产品
库存:16
消费者甲开始消费第35个产品
库存:15
消费者甲开始消费第36个产品
库存:14
消费者甲开始消费第37个产品
库存:13
消费者甲开始消费第38个产品
库存:12
消费者甲开始消费第39个产品
库存:11
消费者甲开始消费第40个产品
库存:10
消费者甲开始消费第41个产品
库存:9
消费者甲开始消费第42个产品
库存:8
消费者甲开始消费第43个产品
库存:7
消费者甲开始消费第44个产品
库存:6
消费者甲开始消费第45个产品
库存:5
消费者甲开始消费第46个产品
库存:4
消费者甲开始消费第47个产品
库存:3
消费者甲开始消费第48个产品
库存:2
消费者甲开始消费第49个产品
库存:1
消费者甲开始消费第50个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第51个产品
库存:1
生产者开始生产第52个产品
库存:2
生产者开始生产第53个产品
库存:3
生产者开始生产第54个产品
库存:4
生产者开始生产第55个产品
库存:5
生产者开始生产第56个产品
库存:6
生产者开始生产第57个产品
库存:7
生产者开始生产第58个产品
库存:8
生产者开始生产第59个产品
库存:9
生产者开始生产第60个产品
库存:10
生产者开始生产第61个产品
库存:11
生产者开始生产第62个产品
库存:12
生产者开始生产第63个产品
库存:13
生产者开始生产第64个产品
库存:14
生产者开始生产第65个产品
库存:15
生产者开始生产第66个产品
库存:16
生产者开始生产第67个产品
库存:17
生产者开始生产第68个产品
库存:18
生产者开始生产第69个产品
库存:19
生产者开始生产第70个产品
库存:20
店员对生产者说:已满仓,先不生产!
库存:20
消费者甲开始消费第51个产品
库存:19
消费者甲开始消费第52个产品
库存:18
消费者甲开始消费第53个产品
库存:17
消费者甲开始消费第54个产品
库存:16
消费者甲开始消费第55个产品
库存:15
消费者甲开始消费第56个产品
库存:14
消费者甲开始消费第57个产品
库存:13
消费者甲开始消费第58个产品
库存:12
消费者甲开始消费第59个产品
库存:11
消费者甲开始消费第60个产品
库存:10
消费者甲开始消费第61个产品
库存:9
消费者甲开始消费第62个产品
库存:8
消费者甲开始消费第63个产品
库存:7
消费者甲开始消费第64个产品
库存:6
消费者甲开始消费第65个产品
库存:5
消费者甲开始消费第66个产品
库存:4
消费者甲开始消费第67个产品
库存:3
消费者甲开始消费第68个产品
库存:2
消费者甲开始消费第69个产品
库存:1
消费者甲开始消费第70个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第71个产品
库存:1
生产者开始生产第72个产品
库存:2
生产者开始生产第73个产品
库存:3
生产者开始生产第74个产品
库存:4
生产者开始生产第75个产品
库存:5
生产者开始生产第76个产品
库存:6
生产者开始生产第77个产品
库存:7
生产者开始生产第78个产品
库存:8
生产者开始生产第79个产品
库存:9
生产者开始生产第80个产品
库存:10
生产者开始生产第81个产品
库存:11
生产者开始生产第82个产品
库存:12
生产者开始生产第83个产品
库存:13
生产者开始生产第84个产品
库存:14
生产者开始生产第85个产品
库存:15
生产者开始生产第86个产品
库存:16
生产者开始生产第87个产品
库存:17
生产者开始生产第88个产品
库存:18
生产者开始生产第89个产品
库存:19
生产者开始生产第90个产品
库存:20
店员对生产者说:已满仓,先不生产!
库存:20
消费者甲开始消费第71个产品
库存:19
消费者甲开始消费第72个产品
库存:18
消费者甲开始消费第73个产品
库存:17
消费者甲开始消费第74个产品
库存:16
消费者甲开始消费第75个产品
库存:15
消费者甲开始消费第76个产品
库存:14
消费者甲开始消费第77个产品
库存:13
消费者甲开始消费第78个产品
库存:12
消费者甲开始消费第79个产品
库存:11
消费者甲开始消费第80个产品
库存:10
消费者甲开始消费第81个产品
库存:9
消费者甲开始消费第82个产品
库存:8
消费者甲开始消费第83个产品
库存:7
消费者甲开始消费第84个产品
库存:6
消费者甲开始消费第85个产品
库存:5
消费者甲开始消费第86个产品
库存:4
消费者甲开始消费第87个产品
库存:3
消费者甲开始消费第88个产品
库存:2
消费者甲开始消费第89个产品
库存:1
消费者甲开始消费第90个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第91个产品
库存:1
生产者开始生产第92个产品
库存:2
生产者开始生产第93个产品
库存:3
生产者开始生产第94个产品
库存:4
生产者开始生产第95个产品
库存:5
生产者开始生产第96个产品
库存:6
生产者开始生产第97个产品
库存:7
生产者开始生产第98个产品
库存:8
生产者开始生产第99个产品
库存:9
生产者开始生产第100个产品
库存:10
生产者开始生产第101个产品
库存:11
生产者开始生产第102个产品
库存:12
生产者开始生产第103个产品
库存:13
生产者开始生产第104个产品
库存:14
生产者开始生产第105个产品
库存:15
生产者开始生产第106个产品
库存:16
生产者开始生产第107个产品
库存:17
生产者开始生产第108个产品
库存:18
生产者开始生产第109个产品
库存:19
生产者开始生产第110个产品
库存:20
店员对生产者说:已满仓,先不生产!
库存:20
消费者甲开始消费第91个产品
库存:19
消费者甲开始消费第92个产品
库存:18
消费者甲开始消费第93个产品
库存:17
消费者甲开始消费第94个产品
库存:16
消费者甲开始消费第95个产品
库存:15
消费者甲开始消费第96个产品
库存:14
消费者甲开始消费第97个产品
库存:13
消费者甲开始消费第98个产品
库存:12
消费者甲开始消费第99个产品
库存:11
消费者甲开始消费第100个产品
库存:10
消费者甲开始消费第101个产品
库存:9
消费者甲开始消费第102个产品
库存:8
消费者甲开始消费第103个产品
库存:7
消费者甲开始消费第104个产品
库存:6
消费者甲开始消费第105个产品
库存:5
消费者甲开始消费第106个产品
库存:4
消费者甲开始消费第107个产品
库存:3
消费者甲开始消费第108个产品
库存:2
消费者甲开始消费第109个产品
库存:1
消费者甲开始消费第110个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
店员对消费者丙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第111个产品
库存:1
生产者开始生产第112个产品
库存:2
生产者开始生产第113个产品
库存:3
生产者开始生产第114个产品
库存:4
生产者开始生产第115个产品
库存:5
消费者甲开始消费第111个产品
库存:4
消费者甲开始消费第112个产品
库存:3
消费者甲开始消费第113个产品
库存:2
消费者甲开始消费第114个产品
库存:1
消费者甲开始消费第115个产品
库存:0
店员对消费者甲说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第116个产品
库存:1
生产者开始生产第117个产品
库存:2
生产者开始生产第118个产品
库存:3
生产者开始生产第119个产品
库存:4
生产者开始生产第120个产品
库存:5
生产者开始生产第121个产品
库存:6
生产者开始生产第122个产品
库存:7
消费者丙开始消费第116个产品
库存:6
消费者丙开始消费第117个产品
库存:5
消费者丙开始消费第118个产品
库存:4
消费者丙开始消费第119个产品
库存:3
消费者丙开始消费第120个产品
库存:2
消费者乙开始消费第121个产品
库存:1
消费者乙开始消费第122个产品
库存:0
店员对消费者乙说:对不起,已售空,请下次再来!
库存:0
生产者开始生产第123个产品
库存:1
生产者开始生产第124个产品
库存:2
生产者开始生产第125个产品
库存:3
生产者开始生产第126个产品
库存:4
生产者开始生产第127个产品
库存:5
生产者开始生产第128个产品
库存:6
生产者开始生产第129个产品
库存:7
生产者开始生产第130个产品
库存:8
生产者开始生产第131个产品
库存:9
生产者开始生产第132个产品
库存:10
生产者开始生产第133个产品
库存:11
生产者开始生产第134个产品
库存:12
生产者开始生产第135个产品
库存:13
// 手动停止运行
Process finished with exit code -1