packagecom.yangyuanyuan.juc1205;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;classShareData
{private int number = 1;//A : 1 B:2 C:3
private Lock lock = newReentrantLock();private Condition c1 =lock.newCondition();private Condition c2 =lock.newCondition();private Condition c3 =lock.newCondition();public voidprint5()
{
lock.lock();try{//1 判断
while(number != 1)
{//wait.....
c1.await();
}//2 干活
for (int i = 1; i <=5; i++)
{
System.out.println(Thread.currentThread().getName()+"\t"+i);
}//3 通知
number = 2;//如何通知第2个
c2.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}public voidprint10()
{
lock.lock();try{//1 判断
while(number != 2)
{//wait.....
c2.await();
}//2 干活
for (int i = 1; i <=10; i++)
{
System.out.println(Thread.currentThread().getName()+"\t"+i);
}//3 通知
number = 3;//如何通知第2个
c3.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}public voidprint15()
{
lock.lock();try{//1 判断
while(number != 3)
{//wait.....
c3.await();
}//2 干活
for (int i = 1; i <=15; i++)
{
System.out.println(Thread.currentThread().getName()+"\t"+i);
}//3 通知
number = 1;//如何通知第2个
c1.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
public classConditionDemo
{public static voidmain(String[] args)
{
ShareData shareData= newShareData();new Thread(() ->{for (int i = 1; i <=10; i++) {
shareData.print5();
}
},"A").start();new Thread(() ->{for (int i = 1; i <=10; i++) {
shareData.print10();
}
},"B").start();new Thread(() ->{for (int i = 1; i <=10; i++) {
shareData.print15();
}
},"C").start();
}
}