java之生产者和消费者问题

时间:2022-07-23
本文章向大家介绍java之生产者和消费者问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
package testThread;

public class Test3 {
    public static void main(String[] args) {
        Clerk c = new Clerk();
        //消费时不生产,生产时不消费
        //生产者
        new Thread(new Runnable() {    
            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (c) {
                    //无限生产
                    while(true) {
                        if(c.productNum == 0) {
                            //开始生产
                            System.out.println("产品为0,开始生产");
                            while(c.productNum<4) {
                                c.productNum++;
                                System.out.println("产品库存:"+c.productNum);
                            }
                            System.out.println("产品数为:"+c.productNum+",结束生产");
                            //唤醒消费者
                            c.notify();
                        }else {
                            try {
                                //生产者等待
                                c.wait();
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                }
                
            }
        },"生产者").start();
        //消费者
        new Thread(new Runnable() {    
            @Override
            public void run() {
                // TODO Auto-generated method stub
                synchronized (c) {
                    while(true) {
                        if(c.productNum == 4) {
                            System.out.println("库存为4,开始消费");
                            while(c.productNum>0) {
                                c.productNum--;
                                System.out.println("产品库存:"+c.productNum);
                            }
                            System.out.println("产品数为:"+c.productNum+",结束消费");
                            //唤醒生产者
                            c.notify();
                        }else {
                            try {
                                //消费者等待
                                c.wait();
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                }
                
            }
        },"消费者").start();
    }
}
class Clerk{
    public static int productNum = 0;
}

部分输出:

产品为0,开始生产 产品库存:1 产品库存:2 产品库存:3 产品库存:4 产品数为:4,结束生产 库存为4,开始消费 产品库存:3 产品库存:2 产品库存:1 产品库存:0 产品数为:0,结束消费 产品为0,开始生产 产品库存:1 产品库存:2 产品库存:3 产品库存:4 产品数为:4,结束生产