import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class eggs
{
//判断是否有鸡蛋
private boolean flag=false;
//第几个鸡蛋
private int sum=0;
Lock lock=new ReentrantLock();
//用当前一个锁 获取2个监视器 一个监视生产鸡蛋 一个监视出售鸡蛋
Condition con1=lock.newCondition();
Condition con2=lock.newCondition();
public void Eggs()
{
lock.lock();
try {
if(flag)
try {
//this.wait();
con1.await();
} catch (Exception e) {
// TODO: handle exception
}
sum++;
System.out.println(Thread.currentThread().getName()+"生产.."+sum);
flag=true;
con2.signal();
}
finally {
lock.unlock();
}
}
public void Sale()
{
try {
lock.lock();
if(!flag)
try {
//this.wait();
con2.await();
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread().getName()+"...销售.."+sum);
flag=false;
con1.signal();
}
finally {
lock.unlock();
}
}
}
class Demo implements Runnable
{
private eggs r;
private boolean f;//判断是生鸡蛋操作 还是销售操作
public Demo(eggs r,boolean f) {
// TODO Auto-generated constructor stub
this.r=r;
this.f=f;
}
public void run()
{
if(f)
while(true)
{
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO: handle exception
}
r.Eggs();
}
else
while(true)
{
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO: handle exception
}
r.Sale();
}
}
}
public class Main {
public static void main(String[] args) {
eggs e=new eggs();
Demo d1=new Demo(e,true);
Demo d2=new Demo(e,false);
Thread t1=new Thread(d1);
Thread t2=new Thread(d2);
t1.start();
t2.start();
}
}
使用Lock和Condition 替代 synchronized的 锁和 等待和唤醒
最新推荐文章于 2021-04-17 09:46:22 发布