A 线程打印 5 次 A,B 线程打印 10 次 B,C 线程打印 15 次 C,按照此顺序循环 10 轮。
我们的思路是定义一个标志flag,当flag==1时,线程1打印A;当flag==B时,线程2打印B;当flag==C时,打印C。
/** * * A 线程打印 5 次 A,B 线程打印 10 次 B,C 线程打印 15 次 C,按照此顺序循环 10 轮 */ class ShareSource{ int flag = 1; private Lock lock = new ReentrantLock(); //创建三个condition,一个condition本质上是绑定一个锁 Condition c1 = lock.newCondition(); Condition c2 = lock.newCondition(); Condition c3 = lock.newCondition(); //打印5次A public void print5(int loop) throws InterruptedException { lock.lock(); try { while(flag!=1){ c1.await(); } for (int i = 1; i <= loop; i++) { System.out.println(Thread.currentThread().getName()+"打印出:A,当前为第"+i+"轮"); } flag = 2; //修改标志位 c2.signal(); //通知线程B } finally { lock.unlock(); } } public void print10(int loop) throws InterruptedException { lock.lock(); try { while (flag!=2){ c2.await(); } for (int i = 1; i <= loop; i++) { System.out.println(Thread.currentThread().getName()+"打印出:B,当前为第"+i+"轮"); } flag = 3; c3.signal(); } finally { lock.unlock(); } } public void print15(int loop) throws InterruptedException { lock.lock(); try{ while(flag!=3){ c3.await(); } for (int i = 1; i <= loop; i++) { System.out.println(Thread.currentThread().getName()+"打印出:C,当前为第"+i+"轮"); } flag = 1; c1.signal(); }finally { lock.unlock(); } } } public class ThreadDemo03 { public static void main(String[] args) { ShareSource shareSource = new ShareSource(); new Thread(()->{ for (int i = 0; i < 10; i++) { try { shareSource.print5(5); } catch (InterruptedException e) { e.printStackTrace(); } } }, "线程A").start(); new Thread(()->{ for (int i = 0; i < 10; i++) { try { shareSource.print10(10); } catch (InterruptedException e) { e.printStackTrace(); } } }, "线程B").start(); new Thread(()->{ for (int i = 0; i < 10; i++) { try { shareSource.print15(15); } catch (InterruptedException e) { e.printStackTrace(); } } }, "线程C").start(); } }
运行结果:
线程A打印出:A,当前为第1轮 线程A打印出:A,当前为第2轮 线程A打印出:A,当前为第3轮 线程A打印出:A,当前为第4轮 线程A打印出:A,当前为第5轮 线程B打印出:B,当前为第1轮 线程B打印出:B,当前为第2轮 线程B打印出:B,当前为第3轮 线程B打印出:B,当前为第4轮 线程B打印出:B,当前为第5轮 线程B打印出:B,当前为第6轮 线程B打印出:B,当前为第7轮 线程B打印出:B,当前为第8轮 线程B打印出:B,当前为第9轮 线程B打印出:B,当前为第10轮 线程C打印出:C,当前为第1轮 线程C打印出:C,当前为第2轮 线程C打印出:C,当前为第3轮 线程C打印出:C,当前为第4轮 线程C打印出:C,当前为第5轮 线程C打印出:C,当前为第6轮 线程C打印出:C,当前为第7轮 线程C打印出:C,当前为第8轮 线程C打印出:C,当前为第9轮 线程C打印出:C,当前为第10轮 线程C打印出:C,当前为第11轮 线程C打印出:C,当前为第12轮 线程C打印出:C,当前为第13轮 线程C打印出:C,当前为第14轮 线程C打印出:C,当前为第15轮 线程A打印出:A,当前为第1轮 线程A打印出:A,当前为第2轮 线程A打印出:A,当前为第3轮 线程A打印出:A,当前为第4轮 线程A打印出:A,当前为第5轮 线程B打印出:B,当前为第1轮 线程B打印出:B,当前为第2轮 线程B打印出:B,当前为第3轮 线程B打印出:B,当前为第4轮 线程B打印出:B,当前为第5轮 线程B打印出:B,当前为第6轮 线程B打印出:B,当前为第7轮 线程B打印出:B,当前为第8轮 线程B打印出:B,当前为第9轮 线程B打印出:B,当前为第10轮 线程C打印出:C,当前为第1轮 线程C打印出:C,当前为第2轮 线程C打印出:C,当前为第3轮 线程C打印出:C,当前为第4轮 线程C打印出:C,当前为第5轮 线程C打印出:C,当前为第6轮 线程C打印出:C,当前为第7轮 线程C打印出:C,当前为第8轮 线程C打印出:C,当前为第9轮 线程C打印出:C,当前为第10轮 线程C打印出:C,当前为第11轮 线程C打印出:C,当前为第12轮 线程C打印出:C,当前为第13轮 线程C打印出:C,当前为第14轮 线程C打印出:C,当前为第15轮 线程A打印出:A,当前为第1轮 线程A打印出:A,当前为第2轮 线程A打印出:A,当前为第3轮 线程A打印出:A,当前为第4轮 线程A打印出:A,当前为第5轮 线程B打印出:B,当前为第1轮 线程B打印出:B,当前为第2轮 线程B打印出:B,当前为第3轮 线程B打印出:B,当前为第4轮 线程B打印出:B,当前为第5轮 线程B打印出:B,当前为第6轮 线程B打印出:B,当前为第7轮 线程B打印出:B,当前为第8轮 线程B打印出:B,当前为第9轮 线程B打印出:B,当前为第10轮 线程C打印出:C,当前为第1轮 线程C打印出:C,当前为第2轮 线程C打印出:C,当前为第3轮 线程C打印出:C,当前为第4轮 线程C打印出:C,当前为第5轮 线程C打印出:C,当前为第6轮 线程C打印出:C,当前为第7轮 线程C打印出:C,当前为第8轮 线程C打印出:C,当前为第9轮 线程C打印出:C,当前为第10轮 线程C打印出:C,当前为第11轮 线程C打印出:C,当前为第12轮 线程C打印出:C,当前为第13轮 线程C打印出:C,当前为第14轮 线程C打印出:C,当前为第15轮 线程A打印出:A,当前为第1轮 线程A打印出:A,当前为第2轮 线程A打印出:A,当前为第3轮 线程A打印出:A,当前为第4轮 线程A打印出:A,当前为第5轮 线程B打印出:B,当前为第1轮 线程B打印出:B,当前为第2轮 线程B打印出:B,当前为第3轮 线程B打印出:B,当前为第4轮 线程B打印出:B,当前为第5轮 线程B打印出:B,当前为第6轮 线程B打印出:B,当前为第7轮 线程B打印出:B,当前为第8轮 线程B打印出:B,当前为第9轮 线程B打印出:B,当前为第10轮 线程C打印出:C,当前为第1轮 线程C打印出:C,当前为第2轮 线程C打印出:C,当前为第3轮 线程C打印出:C,当前为第4轮 线程C打印出:C,当前为第5轮 线程C打印出:C,当前为第6轮 线程C打印出:C,当前为第7轮 线程C打印出:C,当前为第8轮 线程C打印出:C,当前为第9轮 线程C打印出:C,当前为第10轮 线程C打印出:C,当前为第11轮 线程C打印出:C,当前为第12轮 线程C打印出:C,当前为第13轮 线程C打印出:C,当前为第14轮 线程C打印出:C,当前为第15轮 线程A打印出:A,当前为第1轮 线程A打印出:A,当前为第2轮 线程A打印出:A,当前为第3轮 线程A打印出:A,当前为第4轮 线程A打印出:A,当前为第5轮 线程B打印出:B,当前为第1轮 线程B打印出:B,当前为第2轮 线程B打印出:B,当前为第3轮 线程B打印出:B,当前为第4轮 线程B打印出:B,当前为第5轮 线程B打印出:B,当前为第6轮 线程B打印出:B,当前为第7轮 线程B打印出:B,当前为第8轮 线程B打印出:B,当前为第9轮 线程B打印出:B,当前为第10轮 线程C打印出:C,当前为第1轮 线程C打印出:C,当前为第2轮 线程C打印出:C,当前为第3轮 线程C打印出:C,当前为第4轮 线程C打印出:C,当前为第5轮 线程C打印出:C,当前为第6轮 线程C打印出:C,当前为第7轮 线程C打印出:C,当前为第8轮 线程C打印出:C,当前为第9轮 线程C打印出:C,当前为第10轮 线程C打印出:C,当前为第11轮 线程C打印出:C,当前为第12轮 线程C打印出:C,当前为第13轮 线程C打印出:C,当前为第14轮 线程C打印出:C,当前为第15轮 线程A打印出:A,当前为第1轮 线程A打印出:A,当前为第2轮 线程A打印出:A,当前为第3轮 线程A打印出:A,当前为第4轮 线程A打印出:A,当前为第5轮 线程B打印出:B,当前为第1轮 线程B打印出:B,当前为第2轮 线程B打印出:B,当前为第3轮 线程B打印出:B,当前为第4轮 线程B打印出:B,当前为第5轮 线程B打印出:B,当前为第6轮 线程B打印出:B,当前为第7轮 线程B打印出:B,当前为第8轮 线程B打印出:B,当前为第9轮 线程B打印出:B,当前为第10轮 线程C打印出:C,当前为第1轮 线程C打印出:C,当前为第2轮 线程C打印出:C,当前为第3轮 线程C打印出:C,当前为第4轮 线程C打印出:C,当前为第5轮 线程C打印出:C,当前为第6轮 线程C打印出:C,当前为第7轮 线程C打印出:C,当前为第8轮 线程C打印出:C,当前为第9轮 线程C打印出:C,当前为第10轮 线程C打印出:C,当前为第11轮 线程C打印出:C,当前为第12轮 线程C打印出:C,当前为第13轮 线程C打印出:C,当前为第14轮 线程C打印出:C,当前为第15轮 线程A打印出:A,当前为第1轮 线程A打印出:A,当前为第2轮 线程A打印出:A,当前为第3轮 线程A打印出:A,当前为第4轮 线程A打印出:A,当前为第5轮 线程B打印出:B,当前为第1轮 线程B打印出:B,当前为第2轮 线程B打印出:B,当前为第3轮 线程B打印出:B,当前为第4轮 线程B打印出:B,当前为第5轮 线程B打印出:B,当前为第6轮 线程B打印出:B,当前为第7轮 线程B打印出:B,当前为第8轮 线程B打印出:B,当前为第9轮 线程B打印出:B,当前为第10轮 线程C打印出:C,当前为第1轮 线程C打印出:C,当前为第2轮 线程C打印出:C,当前为第3轮 线程C打印出:C,当前为第4轮 线程C打印出:C,当前为第5轮 线程C打印出:C,当前为第6轮 线程C打印出:C,当前为第7轮 线程C打印出:C,当前为第8轮 线程C打印出:C,当前为第9轮 线程C打印出:C,当前为第10轮 线程C打印出:C,当前为第11轮 线程C打印出:C,当前为第12轮 线程C打印出:C,当前为第13轮 线程C打印出:C,当前为第14轮 线程C打印出:C,当前为第15轮 线程A打印出:A,当前为第1轮 线程A打印出:A,当前为第2轮 线程A打印出:A,当前为第3轮 线程A打印出:A,当前为第4轮 线程A打印出:A,当前为第5轮 线程B打印出:B,当前为第1轮 线程B打印出:B,当前为第2轮 线程B打印出:B,当前为第3轮 线程B打印出:B,当前为第4轮 线程B打印出:B,当前为第5轮 线程B打印出:B,当前为第6轮 线程B打印出:B,当前为第7轮 线程B打印出:B,当前为第8轮 线程B打印出:B,当前为第9轮 线程B打印出:B,当前为第10轮 线程C打印出:C,当前为第1轮 线程C打印出:C,当前为第2轮 线程C打印出:C,当前为第3轮 线程C打印出:C,当前为第4轮 线程C打印出:C,当前为第5轮 线程C打印出:C,当前为第6轮 线程C打印出:C,当前为第7轮 线程C打印出:C,当前为第8轮 线程C打印出:C,当前为第9轮 线程C打印出:C,当前为第10轮 线程C打印出:C,当前为第11轮 线程C打印出:C,当前为第12轮 线程C打印出:C,当前为第13轮 线程C打印出:C,当前为第14轮 线程C打印出:C,当前为第15轮 线程A打印出:A,当前为第1轮 线程A打印出:A,当前为第2轮 线程A打印出:A,当前为第3轮 线程A打印出:A,当前为第4轮 线程A打印出:A,当前为第5轮 线程B打印出:B,当前为第1轮 线程B打印出:B,当前为第2轮 线程B打印出:B,当前为第3轮 线程B打印出:B,当前为第4轮 线程B打印出:B,当前为第5轮 线程B打印出:B,当前为第6轮 线程B打印出:B,当前为第7轮 线程B打印出:B,当前为第8轮 线程B打印出:B,当前为第9轮 线程B打印出:B,当前为第10轮 线程C打印出:C,当前为第1轮 线程C打印出:C,当前为第2轮 线程C打印出:C,当前为第3轮 线程C打印出:C,当前为第4轮 线程C打印出:C,当前为第5轮 线程C打印出:C,当前为第6轮 线程C打印出:C,当前为第7轮 线程C打印出:C,当前为第8轮 线程C打印出:C,当前为第9轮 线程C打印出:C,当前为第10轮 线程C打印出:C,当前为第11轮 线程C打印出:C,当前为第12轮 线程C打印出:C,当前为第13轮 线程C打印出:C,当前为第14轮 线程C打印出:C,当前为第15轮 线程A打印出:A,当前为第1轮 线程A打印出:A,当前为第2轮 线程A打印出:A,当前为第3轮 线程A打印出:A,当前为第4轮 线程A打印出:A,当前为第5轮 线程B打印出:B,当前为第1轮 线程B打印出:B,当前为第2轮 线程B打印出:B,当前为第3轮 线程B打印出:B,当前为第4轮 线程B打印出:B,当前为第5轮 线程B打印出:B,当前为第6轮 线程B打印出:B,当前为第7轮 线程B打印出:B,当前为第8轮 线程B打印出:B,当前为第9轮 线程B打印出:B,当前为第10轮 线程C打印出:C,当前为第1轮 线程C打印出:C,当前为第2轮 线程C打印出:C,当前为第3轮 线程C打印出:C,当前为第4轮 线程C打印出:C,当前为第5轮 线程C打印出:C,当前为第6轮 线程C打印出:C,当前为第7轮 线程C打印出:C,当前为第8轮 线程C打印出:C,当前为第9轮 线程C打印出:C,当前为第10轮 线程C打印出:C,当前为第11轮 线程C打印出:C,当前为第12轮 线程C打印出:C,当前为第13轮 线程C打印出:C,当前为第14轮 线程C打印出:C,当前为第15轮 Process finished with exit code 0