有顺序的唤醒线程
说几个重点:
因为线程是根据cpu随机调度的,所以,这个是不确定的,但是,你进了方法,你不符合条件,我就让你干等,
这样我就实现了线程的顺序执行。
A抢到锁了,必须等A把锁释放,其他人才能再抢到锁走自己的逻辑。。。
A 执行完调用B,B执行完调用C,C执行完调用A
package com.juc.等待唤醒;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/*** A 执行完调用B,B执行完调用C,C执行完调用A*/public class C {public static void main(String[] args) {Data3 data = new Data3();new Thread(()->{for (int i = 0; i <10 ; i++) {data.printA();}},"A").start();new Thread(()->{for (int i = 0; i <10 ; i++) {data.printB();}},"B").start();new Thread(()->{for (int i = 0; i <10 ; i++) {data.printC();}},"C").start();}}class Data3{ // 资源类 Lockprivate Lock lock = new ReentrantLock();private Condition condition1 = lock.newCondition();private Condition condition2 = lock.newCondition();private Condition condition3 = lock.newCondition();private int number = 1; // 1A 2B 3Cpublic void printA(){System.out.println("A进来了~~~~");lock.lock();try {// 业务,判断-> 执行-> 通知while (number!=1){// 等待condition1.await();}System.out.println(Thread.currentThread().getName()+"=>AAAAAAA");// 唤醒,唤醒指定的人,Bnumber = 2;condition2.signal();} catch (Exception e) {e.printStackTrace();} finally {System.out.println("A释放锁完毕");lock.unlock();}}public void printB(){System.out.println("B进来了~~~~");lock.lock();try {// 业务,判断-> 执行-> 通知while (number!=2){condition2.await();}System.out.println(Thread.currentThread().getName()+"=>BBBBBBBBB");// 唤醒,唤醒指定的人,cnumber = 3;condition3.signal();} catch (Exception e) {e.printStackTrace();} finally {System.out.println("B释放锁完毕");lock.unlock();}}public void printC(){System.out.println("C进来了~~~~");lock.lock();try {// 业务,判断-> 执行-> 通知// 业务,判断-> 执行-> 通知while (number!=3){condition3.await();}System.out.println(Thread.currentThread().getName()+"=>CCCCCCC");// 唤醒,唤醒指定的人,cnumber = 1;condition1.signal();} catch (Exception e) {e.printStackTrace();} finally {System.out.println("C释放锁完毕");lock.unlock();}}}
B进来了~~~~A进来了~~~~C进来了~~~~A=>AAAAAAAA释放锁完毕A进来了~~~~B=>BBBBBBBBBB释放锁完毕B进来了~~~~C=>CCCCCCCC释放锁完毕C进来了~~~~A=>AAAAAAAA释放锁完毕A进来了~~~~B=>BBBBBBBBBB释放锁完毕B进来了~~~~C=>CCCCCCCC释放锁完毕C进来了~~~~A=>AAAAAAAA释放锁完毕A进来了~~~~B=>BBBBBBBBBB释放锁完毕B进来了~~~~C=>CCCCCCCC释放锁完毕C进来了~~~~A=>AAAAAAAA释放锁完毕A进来了~~~~B=>BBBBBBBBBB释放锁完毕B进来了~~~~C=>CCCCCCCC释放锁完毕C进来了~~~~A=>AAAAAAAA释放锁完毕A进来了~~~~B=>BBBBBBBBBB释放锁完毕B进来了~~~~C=>CCCCCCCC释放锁完毕C进来了~~~~A=>AAAAAAAA释放锁完毕A进来了~~~~B=>BBBBBBBBBB释放锁完毕B进来了~~~~C=>CCCCCCCC释放锁完毕C进来了~~~~A=>AAAAAAAA释放锁完毕A进来了~~~~B=>BBBBBBBBBB释放锁完毕B进来了~~~~C=>CCCCCCCC释放锁完毕C进来了~~~~A=>AAAAAAAA释放锁完毕A进来了~~~~B=>BBBBBBBBBB释放锁完毕B进来了~~~~C=>CCCCCCCC释放锁完毕C进来了~~~~A=>AAAAAAAA释放锁完毕A进来了~~~~B=>BBBBBBBBBB释放锁完毕B进来了~~~~C=>CCCCCCCC释放锁完毕C进来了~~~~A=>AAAAAAAA释放锁完毕B=>BBBBBBBBBB释放锁完毕C=>CCCCCCCC释放锁完毕
