线程:多生产多消费-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();
        }
    }
}

 

posted @ 2019-06-12 11:08  Y歪  阅读(226)  评论(0)    收藏  举报