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();
    }

测试结果:

 

posted @ 2019-05-02 12:28  MrChengs  阅读(234)  评论(0编辑  收藏  举报