三个线程用三个不同的监视器监视,来达到我们实现精准通知和唤醒
还是记住Lock锁的三步曲:判断等待,业务,通知
package com.liao.lesson1;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test04 {
public static void main(String[] args) {
Data1 data = new Data1();
new Thread(()->{for (int i = 0; i < 10; i++) data.muaA();},"A").start();
new Thread(()->{for (int i = 0; i < 10; i++) data.muaB();},"B").start();
new Thread(()->{for (int i = 0; i < 10; i++) data.muaC();},"C").start();
}
}
class Data1{
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
private int number = 1;
public void muaA(){
lock.lock();
try {
while (number!=1){
condition1.await();
}
System.out.println(Thread.currentThread().getName()+"A----》");
number = 2;
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void muaB(){
lock.lock();
try {
while (number!=2){
condition2.await();
}
System.out.println(Thread.currentThread().getName()+"B----》");
number = 3;
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void muaC(){
lock.lock();
try {
while (number!=3){
condition3.await();
}
System.out.println(Thread.currentThread().getName()+"C----》");
condition1.signal();
number=1;
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}