需要使用lock的Condition接口来实现三个线程顺序打印
* Lock
* condition.await();
* condition.signal();
* condition.signalAll();
* 和wait(), notify(), notifyALl() 功能差不多
* 区别 notify唤醒
* signal唤醒某一把锁
*
*/
class ShareData{
//为何用Lock Lock可以设置多把锁和多把钥匙 可以定向唤醒 Lockgood_demo
private int number = 1;//a:1 b:2 c:3
//synchronized重锁1.8前
private Lock lock=new ReentrantLock();//ReentrantLock递归锁 非公平锁 新版的
private Condition c1=lock.newCondition();//多把钥匙 多吧锁
private Condition c2=lock.newCondition();
private Condition c3=lock.newCondition();
public void printc1() {
lock.lock();
try{
while (number!=1){c1.await();}//if可能有虚假唤醒//1.判断
System.out.println(Thread.currentThread().getName()+"\t执行");//2.干活
number=2;c2.signalAll(); //3.通知
}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}
}
public void printc2() {
lock.lock();
try{
while (number!=2){c2.await();}//if可能有虚假唤醒//1.判断
System.out.println(Thread.currentThread().getName()+"\t执行");//2.干活
number=3;c3.signalAll();//3.通知
}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}
}
public void printc3() {
lock.lock();
try{
while (number!=3){c3.await();}//if可能有虚假唤醒//1.判断
System.out.println(Thread.currentThread().getName()+"\t执行");//2.干活
number=1;c1.signalAll(); //3.通知
}catch (Exception e){e.printStackTrace();}finally {lock.unlock();}
}
}
public static void main(String[] args) {
Lockgood_demo();
}
private static void Lockgood_demo() {
ShareData shareData=new ShareData();
//顺序打印五遍A B C
new Thread(()->{for (int i = 0; i < 5; i++) shareData.printc1();},"A").start();
new Thread(()->{for (int i = 0; i < 5; i++) shareData.printc2();},"B").start();
new Thread(()->{for (int i = 0; i < 5; i++) shareData.printc3();},"C").start();
} //精确唤醒某些线程 private Condition c1=lock.newCondition();//多把钥匙 多把锁