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

  • 相关阅读:
    hdu 4825 Xor Sum (01 Trie)
    hdu 5877 Weak Pair (Treap)
    bzoj 1861: [Zjoi2006]Book 书架 (splay)
    bzoj 1503: [NOI2004]郁闷的出纳员 (splay)
    hihocoder#1333 : 平衡树·Splay2 (区间操作)
    「BZOJ1251」序列终结者 (splay 区间操作)
    二进制运算符的相关运算
    Bzoj 1085: [SCOI2005]骑士精神 (dfs)
    Bzoj 1083: [SCOI2005]繁忙的都市 (最小生成树)
    Bzoj 1088: [SCOI2005]扫雷Mine (DP)
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12076936.html
Copyright © 2020-2023  润新知