//练习题
//生产者(Producer) 将产品交给店员(Clerk) 而消费者(Customer)从店员处取走商品
// 店员一次只能持有固定数量的产品(比如20) 如果生产者试图生产更多的产品
// 店员会叫生产者停一停 如果店中有空位 再通知生产者 继续生产
// 如果店中没有了产品 店员会告诉消费者等一下
// 如果店中有了产品 再通知消费者取走产品
// 分析1. 是否是多线程问题 ? 是 生产者线程 消费者线程
// 2. 是否有共享数据? 是 店员(或产品)
// 3. 如何解决线程安全问题?
// 4. 是否涉及到线程通信? 是
Clerk clerk = new Clerk();
Producer producer = new Producer(clerk);
Customer customer = new Customer(clerk);
Thread thread2 = new Thread(producer);
Thread thread3=new Thread(customer);
Thread thread4=new Thread(producer);
thread2.setName("生产者1");
thread3.setName("消费者1");
thread4.setName("生产者2");
thread2.start();
thread4.start();
thread3.start();
package com.day7.test;
/**
* User: Json
* Date: 2021/8/20
* 生产者
**/
public class Producer implements Runnable{
private Clerk clerk;
public Producer(Clerk clerk){
this.clerk=clerk;
}
@Override
public void run() {
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.clerk.pro();
}
}
}
package com.day7.test;
/**
* User: Json
* Date: 2021/8/20
* 店员
**/
public class Clerk {
private int num=0;
//生产商品
public synchronized void pro(){
if(num<20){
num++;
System.out.println(Thread.currentThread().getName()+"生产的第"+num+"产品");
notify();
}else{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//消费商品
public synchronized void Cus(){
if(num>0){
System.out.println(Thread.currentThread().getName()+"消费了第"+num+"个产品");
num--;
notify();
}else{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.day7.test;
/**
* User: Json
* Date: 2021/8/20
* 消费者
**/
public class Customer implements Runnable{
private Clerk clerk;
public Customer(Clerk clerk){
this.clerk=clerk;
}
@Override
public void run() {
while (true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.clerk.Cus();
}
}
}