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是等待