• 线程:多生产多消费-Lock


    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /* 生产者消费者:
    * 研究:研究Lock
     * 比较synchronized和Lock
     * 1.synchronized:从jdk1.0就开始使用的同步方法-称为隐式同步
     *     synchronized(锁对象){//获取锁      我们将锁还可以称为锁旗舰或者监听器
     *         同步的代码
     * }//释放锁
     * 2.Lock:从jdk1.5开始使用的同步方法-称为显示同步
     * 
     * 原理:Lock本身是接口,要通过他的子类创建对象干活儿
     *  使用过程:
     *  首先调用lock()方法获取锁
     *    进行同步的代码块儿
     *  使用unlock()方法释放锁
     *  
     *  使用的场景:
     *  当进行多生产者多消费者的功能时,使用Lock,其他的都使用synchronized
     *  
     *  使用效率上:Lock高于synchronized
     */
    public class Demo7 {
        public static void main(String[] args) {
            //准备数据
            Product2 product = new Product2();
            //准备任务
            Producer2 producer = new Producer2(product);
            Consumer2 consumer = new Consumer2(product);
            //准备线程
            Thread proThread1 = new Thread(producer);
            Thread proThread2 = new Thread(producer);
            Thread conThread1 = new Thread(consumer);
            Thread conThread2 = new Thread(consumer);
            //开启线程
            proThread1.start();
            conThread1.start();    
            proThread2.start();
            conThread2.start();    
        }
    }
    
    //创建产品
    class Product2{
        String name;//产品的名字
        double price;//产品的价格
        int count;//生产的产品数量
        
        //标识
        boolean flag = false;
        
        //创建锁对象
        Lock lock = new ReentrantLock();
        //用于生产任务的Condition
        Condition proCon = lock.newCondition();
        //用于消费任务的Condition
        Condition conCon = lock.newCondition();
        
        //准备生产
        public  void setProduce(String name,double price){
            try {
                lock.lock();//获取锁
                while (flag == true) {
                    try {
                        //wait();//让生产线程等待
                        proCon.await();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
                this.name = name;
                this.price = price;
                System.out.println(Thread.currentThread().getName()+"   生产了:"+this.name+"   产品的数量:"+this.count+"   价格:"+this.price);
                
                count++;
                flag = ! flag;
                //notify();//唤醒消费线程
                //notifyAll();
                conCon.signal();
            }finally {
                lock.unlock();//释放锁
            }
            
        }
        //准备消费
        public   void getConsume() {
            try {
                lock.lock();
                while (flag == false) {
                    try {
                        //wait();//让消费线程等待
                        conCon.await();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName()+"   消费了:"+this.name+"   产品的数量:"+this.count+"   价格:"+this.price);
                //唤醒生产线程
                flag = ! flag;
                //notify();
                //notifyAll();
                proCon.signal();
            }finally {
                lock.unlock();
            }
        }
    }
    //创建生产任务
    class Producer2 implements Runnable{
        Product2 product;
        public Producer2(Product2 product) {
            super();
            this.product = product;
        }
        public void run() {
            while (true) {
                product.setProduce("bingbing", 10);
            }
            
        }
    }
    //创建消费任务
    class Consumer2 implements Runnable{
        Product2 product;
        public Consumer2(Product2 product) {
            super();
            this.product = product;
        }
        public void run() {
            while (true) {
                product.getConsume();
            }
        }
    }
  • 相关阅读:
    android AudioManager AUDIOFOCUS
    uboot环境变量实现分析
    观察者模式总结
    【BZOJ3270】博物馆 概率DP 高斯消元
    从零開始学android<TabHost标签组件.二十九.>
    怎样在Web项目中的service业务层获取项目根路劲
    TexturePacker 算法
    [leetCode 75] Sort Colors
    无人车可能导致器官捐献者短缺以及吸烟率下降:4星|《无人驾驶,十万亿美元的大饼怎么分?》
    如何寻找颠覆式创新的机会,《创新者的窘境》作者二十年磨一剑:4星|《与运气竞争》
  • 原文地址:https://www.cnblogs.com/yumengfei/p/11008372.html
Copyright © 2020-2023  润新知