zoukankan      html  css  js  c++  java
  • 线程:多生产多消费-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();
            }
        }
    }
  • 相关阅读:
    问题-Delphi在多线程中使用其他窗体上的控件,报“尚未调用CoInitialize”解决方法
    问题-Delphi不能进行调试模式
    问题-Delphi为什么不能连接oracle
    问题-delphi无法编辑oracle表
    问题-[致命错误] Project1.dpr(1): Unit not found: 'System.pas' or binary equivalents (DCU,DPU)
    问题-Delphi编译时提示缺少delphi自己的单元文件
    教程-Delphi7 自带控件安装对应表
    问题-提示“adodataset.command”
    问题-提示“不正常地定义参数对象。提供了不一致或不完整的信息。”
    问题-[Delphi]提示Can't load package:dclite70.bpl解决方法
  • 原文地址:https://www.cnblogs.com/yumengfei/p/11008372.html
Copyright © 2011-2022 走看看