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,结束生产

猜你喜欢

转载自www.cnblogs.com/xiximayou/p/12076936.html