Lock 和 Condition的简单应用,多生产多消费线程

/* 生产者消费者:

  • 研究:研究Lock
  • 比较synchronized和Lock
  • 1.synchronized:从jdk1.0就开始使用的同步方法-称为隐式同步
  • synchronized(锁对象){//获取锁 我们将锁还可以称为锁旗舰或者监听器
  • // 这里放同步的代码
  • }//释放锁
  • 2.Lock:从jdk1.5开始使用的同步方法-称为显示同步
  • 原理:Lock本身是接口,要通过他的子类创建对象干活儿
  • 使用过程:
  • 首先调用lock()方法获取锁
  • 进行同步的代码块儿
  • 使用unlock()方法释放锁
  • 使用的场景:
  • 当进行多生产者多消费者的功能时,使用Lock,其他的都使用synchronized
  • 使用效率上:Lock高于synchronized
    */

主方法:

public class Demo {
    	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();
			}
		}
		count--;
		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();
		}
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值