需求
- 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员那里取出产品
- 店员一次只能持有固定数量的产品(20),如果生产者试图生产更多的产品,店员会叫生产者停产
- 如果店中有空位放产品了,再通知生产者继续生产,如果店中没有产品了,会叫消费者等一下。
- 如果店中有产品了,会叫消费者过来取。
分析
- 1、涉及到多线程问题:消费者、生产者
- 2、涉及到数据共享问题,即线程安全问题
- 3、共享数据是生产的数量
- 4、涉及到线程之间的通信–>生产者与消费者之间的通信。
- Clerk(职员类) 里面定义了产品的数量, 以及生产者对于共享数据和消费者的方法。
class Clerk{
int production;
//涉及到线程安全,加锁
public synchronized void addProduct() {
if(production >= 20) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
production ++;
System.out.println(Thread.currentThread().getName()+"生产产品,生产的为第" + production +"个");
notifyAll();
}
}
public synchronized void customerProduct() {
//当小于0时,就让消费者等待
if(production <= 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println(Thread.currentThread().getName()+"消费了的为第" + production +"个");
production --;
notifyAll();
}
}
}
- Productor(生产者类) ,里面的构造器中实例化了Clerk类,调用了店员的增加产品的方法。
class Productor implements Runnable{
//利用构造器来实例化Clerk
Clerk clerk;
public Productor (Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println("生产者开始生产产品");
while(true) {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.addProduct();
}
}
}
- Customer(生产者类) ,里面的构造器中实例化了Clerk类,以及调用了店员对于消费者消费产品的方法。
class Customer implements Runnable {
Clerk clerk;
public Customer (Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println("消费者消费产品");
while (true) {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.customerProduct();
}
}
}
- 测试
public static void main(String[] args) {
Clerk clerk = new Clerk();
Productor productor = new Productor(clerk);
Customer customer = new Customer(clerk);
//创建线程
Thread t1 = new Thread(productor);
Thread t2 = new Thread(customer);
//给线程取名字
t1.setName("生产者");
t2.setName("消费者");
t1.start();
t2.start();
}
每次积累都是对提高自己的表现,加油,我还没追上你呢!哈哈!即使追上你了,我也不会停止我奋斗的步伐,因为我会让你过上好日子的!