JUC学习之线程按序交替

本文为看视频学习笔记,若有错误请指正,谢谢!

例题:编写一个程序,开启3个线程,这3个线程的ID分别是A,B,C,每个线程将自己的ID在屏幕上面打印10遍,要求输出的结果必须按顺序显示。例如:ABCABCABC……一次递归

代码:

public class TestABCAlternate {

    public static void main(String[] args){
        AlternateDemo alternateDemo = new AlternateDemo();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 10; i++) {
                    alternateDemo.loopA(i);
                }
            }
        },"A").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 10; i++) {
                    alternateDemo.loopB(i);
                }
            }
        },"B").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 10; i++) {
                    alternateDemo.loopC(i);
                }
            }
        },"C").start();
    }
}

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 {
            if(number != 1){
                try {
                    condition1.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() +"\t"+ totalLoop);
            number = 2;
            condition2.signal();

        }finally {
            lock.unlock();
        }
    }

    public void loopB(int totalLoop){

        lock.lock();

        try {
            if(number != 2){
                try {
                    condition2.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() +"\t"+ totalLoop);
            number = 3;
            condition3.signal();

        }finally {
            lock.unlock();
        }
    }

    public void loopC(int totalLoop){

        lock.lock();

        try {
            if(number != 3){
                try {
                    condition3.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() +"\t"+ totalLoop);
            System.out.println("============");
            number = 1;
            condition1.signal();

        }finally {
            lock.unlock();
        }
    }
}

运行结果:

《JUC学习之线程按序交替》

如果对这个题目进行进一步的衍生,比如要求输出的结果是“ABBCCCABBCCCABBCCC……“,那么我们就对代码做出相应的改变。

public void loopA(int totalLoop){

        lock.lock();

        try {
            if(number != 1){
                try {
                    condition1.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int i = 1; i <= 1 ; i++) {
                System.out.println(Thread.currentThread().getName() +"\t"+ i + "\t"+totalLoop);
            }
            number = 2;
            condition2.signal();

        }finally {
            lock.unlock();
        }
    }

    public void loopB(int totalLoop){

        lock.lock();

        try {
            if(number != 2){
                try {
                    condition2.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int i = 1; i <= 2 ; i++) {
                System.out.println(Thread.currentThread().getName() +"\t"+ i + "\t" + totalLoop);
            }
            number = 3;
            condition3.signal();

        }finally {
            lock.unlock();
        }
    }

    public void loopC(int totalLoop){

        lock.lock();

        try {
            if(number != 3){
                try {
                    condition3.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int i = 1; i <=3 ; i++) {
                System.out.println(Thread.currentThread().getName() +"\t"+ i + "\t"+ totalLoop);
            }
            System.out.println("============");
            number = 1;
            condition1.signal();

        }finally {
            lock.unlock();
        }
    }

运行的结果:

《JUC学习之线程按序交替》

    原文作者:JUC
    原文地址: https://blog.csdn.net/dyt443733328/article/details/80014008
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞