该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。
解决问题的思想:让消费者在商品为空的时候进行休眠等等待生产者运行后的唤醒 ,让生产者在商品为最大限制的时候进行休眠不再生产。
利用 wait / notifyAll 解决代码示例:
商品仓库类:
class Obj{//定义一个仓库
//定义生产的产品goods的初始值为0;
private int goods= 0;
//定义仓库最多存放10件产品
private final int MAX_SIZE = 10;
public Obj(){
}
public Obj(int goods){
this.goods=goods;
}
生产者类:
class Producer implements Runnable{//定义一个生产者的类
private Obj obj1;
public Producer(){}
public Producer(Obj obj1){
this.obj1= obj1;
}
@Override
public void run(){
while(true){
try{
Thread.sleep(2000);
obj1.consume();
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
消费者类:
class Customer implements Runnable{//定义一个消费者的类
private Obj obj1;
public Customer(){}
public Customer(Obj obj1){
this.obj1= obj1;
}
@Override
public void run(){
while(true){
try{
Thread.sleep(2000);
obj1.produce();
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
主函数
public class test1 {//主函数:
public static void main(String[] args) {
Obj obj=new Obj();
Thread p1 = new Thread(new Producer(obj));
Thread p2 = new Thread(new Producer(obj));
Thread c1 = new Thread(new Customer(obj));
Thread c2 = new Thread(new Customer(obj));
p1.start();
p2.start();
c1.start();
c2.start();
}
}
结果展示: