9、JUC--线程按序交替
线程按序交替
编写一个程序,开启 3 个线程,这三个线程的 ID 分别为
A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要
求输出的结果必须按顺序显示。
如:ABCABCABC…… 依次递归
class AlternateDemo{ private int number =1;//当前执行线程的标记 private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); public void loopA(int totalLoop){ lock.lock(); try { //1、判断 if(number !=1){ condition1.await(); } //2、打印输出 for(int i=1;i<=5;i++){ System.out.println(Thread.currentThread().getName()+"\t"+ i + "\t" + totalLoop); } //3、唤醒下一个线程 number =2; condition2.signal(); }catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void loopB(int totalLoop){ lock.lock(); try { //1、判断 if(number !=2){ condition2.await(); } //2、打印输出 for(int i=1;i<=5;i++){ System.out.println(Thread.currentThread().getName()+"\t"+ i + "\t" + totalLoop); } //3、唤醒下一个线程 number =3; condition3.signal(); }catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void loopC(int totalLoop){ lock.lock(); try { //1、判断 if(number !=3){ condition3.await(); } //2、打印输出 for(int i=1;i<=5;i++){ System.out.println(Thread.currentThread().getName()+"\t"+ i + "\t" + totalLoop); } //3、唤醒下一个线程 number =1; condition1.signal(); }catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } }
测试类中:
public static void main(String[] args) { AlternateDemo ad = new AlternateDemo(); //A new Thread(new Runnable() { @Override public void run() { for(int i =1;i <10;i++){ ad.loopA(i); } } },"A").start(); //B new Thread(new Runnable() { @Override public void run() { for(int i =1;i <10;i++){ ad.loopB(i); } } },"B").start(); //C new Thread(new Runnable() { @Override public void run() { for(int i =1;i <10;i++){ ad.loopC(i); } } },"C").start(); }
测试结果: