import com.sun.org.apache.xml.internal.security.Init; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; // 写一个程序,实现打印完A,打印B public class ReentryLockTest { public static void main(String[] args) { ResLock resLock = new ResLock(); for (int i =0;i< 10 ;i++) { new Thread(()->{ resLock.printA(); }).start(); new Thread(()->{ resLock.printB(); }).start(); new Thread(()->{ resLock.printC(); }).start(); } } } class ResLock { Lock lock =new ReentrantLock(); Condition conditionA = lock.newCondition(); Condition conditionB = lock.newCondition(); Condition conditionC = lock.newCondition(); static int num=1; public void printA () { while (num ==1) { lock.lock(); System.out.println("A"); try { num = 2; conditionA.await(); conditionB.signal(); }catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); } } } public void printB () { while (num ==2) { lock.lock(); System.out.println("B"); try { num =3; conditionB.await(); conditionC.signal(); }catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); } } } public void printC () { while (num ==3) { lock.lock(); System.out.println("C"); System.out.println(" -------------------------------- "); try { num =1; conditionC.await(); conditionA.signal(); }catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); } } } }
先上代码,实现思路:1个Lock锁,三个condition,conditionA,conditionB,conditionC,设计一个状态位,标志着三个锁的情况,cA打印A,修改状态为2,锁住当前线程,通知conditionB,cB打印B,修改状态为3,锁住当前线程,通知conditionC,conditionC打印C,修改状态为1,锁住当前的线程,通知conditionC
循环10次,打印10个来回的ABC
总结:condition中的signal是唤醒,await是等待