本次使用的编译工具是idea
package lt.test01; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 多线程之间按照顺序的调用、实现a-b-c、三个线程启动要求 * aa打印5次、bb打印10次、cc打印15次 * aa打印5次、bb打印10次、cc打印15次 * 共计来5轮 */ public class ThreadRelay { private int number = 1; private Lock lock = new ReentrantLock(); Condition con = lock.newCondition(); Condition con1 = lock.newCondition(); Condition con2 = lock.newCondition(); public void loapAA(int loop){ lock.lock(); try{ //判断 while(number !=1){ con.await(); } //干活 for (int i = 1; i <= 5; i++) { System.out.print(Thread.currentThread().getName()+"\t"+i+"\t当前是第:"+loop+"轮\n"); } //线程的唤醒+改标记 number = 2; con1.signal(); }catch(Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } public void loapBB(int loop){ lock.lock(); try{ //判断 while(number !=2){ con1.await(); } //干活 for (int i = 1; i <= 10; i++) { System.out.print(Thread.currentThread().getName()+"\t"+i+"\t当前是第:"+loop+"轮\n"); } number = 3; con2.signal(); }catch(Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } public void loapCC(int loop){ lock.lock(); try{ //判断 while(number !=3){ con2.await(); } //干活 for (int i = 1; i <= 15; i++) { System.out.print(Thread.currentThread().getName()+"\t"+i+"\t当前是第:"+loop+"轮 \n"); } number =1 ; con.signal(); }catch(Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } public static void main(String[] args){ final ThreadRelay t = new ThreadRelay(); new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 5; i++) { t.loapAA(i); } } },"AA").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 5; i++) { t.loapBB(i); } } },"BB").start(); new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 5; i++) { t.loapCC(i); } } },"CC").start(); } }