产品仓库类

@SuppressWarnings("all")
public class StoreHouse {
    private int cut = 0;// 用于记录产品的数量
    public synchronized void produceProduct(){
        notify();
        if(cut < 10){
            System.out.println(Thread.currentThread().getName()+"正在生产第: ["+(cut+1)+"] 个产品");
            cut ++;
        }else{
            System.out.println("仓库已经满了");
            try{
                wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
    public synchronized void consumerProduct(){
        notify();
        if(cut > 0){
            System.out.println("线程"+Thread.currentThread().getName()+"正在消费第: ["+(cut-1)+"] 个产品");
            cut --;
        }else{
            try{
                wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

生产者

@SuppressWarnings("all")
public class ProduceThread extends Thread{
    // 声明一个参数类型的引用作为成员变量,为了能够调用仓库类中的生产方法,合成复用原则
    private StoreHouse storeHouse;
    // 为了确保两个线程公用共一个仓库
    public ProduceThread (StoreHouse storeHouse){
        this.storeHouse = storeHouse;
    }
    @Override
    public void run(){
        while(true){
            storeHouse.produceProduct();
            try{
                Thread.sleep(100);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

消费者

@SuppressWarnings("all")
public class ConsumerThread extends Thread{
    // 声明参数类型引用作为成员变量,合成复用原则
    private StoreHouse storeHouse;
    // 创建有参构造,让两个线程共同使用一个仓库
    public ConsumerThread (StoreHouse storeHouse) {
        this.storeHouse = storeHouse;
    }
    @Override
    public void run(){
        while(true){
            storeHouse.consumerProduct();
            try{
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

测试类

@SuppressWarnings("all")
public class StoreHouseTest {
    public static void main(String[]args){
        // 创建仓库类对象
        StoreHouse storeHouse = new StoreHouse();
        // 创建线程类对象并启动
        ProduceThread produce = new ProduceThread(storeHouse);
        ConsumerThread consumer = new ConsumerThread(storeHouse);
        produce.start();
        consumer.start();
    }
}
--------------------------RUN--------------------------
Thread-0正在生产第: [1] 个产品
线程Thread-1正在消费第: [0] 个产品
Thread-0正在生产第: [1] 个产品
Thread-0正在生产第: [2] 个产品
Thread-0正在生产第: [3] 个产品
Thread-0正在生产第: [4] 个产品
Thread-0正在生产第: [5] 个产品
Thread-0正在生产第: [6] 个产品
Thread-0正在生产第: [7] 个产品
Thread-0正在生产第: [8] 个产品
Thread-0正在生产第: [9] 个产品
线程Thread-1正在消费第: [8] 个产品
Thread-0正在生产第: [9] 个产品
Thread-0正在生产第: [10] 个产品
仓库已经满了
线程Thread-1正在消费第: [9] 个产品
Thread-0正在生产第: [10] 个产品
仓库已经满了
线程Thread-1正在消费第: [9] 个产品
Thread-0正在生产第: [10] 个产品
仓库已经满了
线程Thread-1正在消费第: [9] 个产品
Thread-0正在生产第: [10] 个产品
仓库已经满了
线程Thread-1正在消费第: [9] 个产品
Thread-0正在生产第: [10] 个产品
仓库已经满了
线程Thread-1正在消费第: [9] 个产品
Thread-0正在生产第: [10] 个产品
仓库已经满了