JUC学习之线程按序交替

这篇博客探讨了如何使用Java并发工具包(JUC)来实现三个线程按特定顺序交替打印其ID。通过一个示例展示了如何创建程序,使得线程ID以ABC的顺序循环打印,并进一步讨论了如何修改代码以实现'ABBCCC...'的交替打印模式。
摘要由CSDN通过智能技术生成

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

例题:编写一个程序,开启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();
        }
    }
}

运行结果:

如果对这个题目进行进一步的衍生,比如要求输出的结果是“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();
        }
    }
运行的结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值