Condition线程通信,交替执行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35241080/article/details/82530913
一、线程通信,交替执行

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

使用锁加上condition来实现

congdition接口下的基本方法
await() //进入等待
await(long, TimeUnit)//等待时间
awaitNanos(long)
awaitUninterruptibly()
awaitUntil(Date)
signal()    //信号,唤醒线程-与notify类似
signalAll() //唤醒所有线程
二、demo

​ 三个线程则每个线程调用一个方法,每个方法交替通知该谁执行了,例如A打印完通知B开始,B打印完通知C开始,C打印完通知A,以此类推

public class ConditionDemo {
    public static void main(String[] args) {
        final ConditionTest ad = new ConditionTest();

        new Thread(new Runnable() {
            @Override
            public void run() {

                for (int i = 1; i <= 20; i++) {
                    ad.loopA(i);
                }

            }
        }, "A").start();

        new Thread(new Runnable() {
            @Override
            public void run() {

                for (int i = 1; i <= 20; i++) {
                    ad.loopB(i);
                }
            }
        }, "B").start();

        new Thread(new Runnable() {
            @Override
            public void run() {

                for (int i = 1; i <= 20; i++) {
                    ad.loopC(i);

                    System.out.println("-----------------------------------");
                }

            }
        }, "C").start();
    }

    }
class ConditionTest {
    private int number=1;
    private Lock lock = new ReentrantLock();
    private java.util.concurrent.locks.Condition cd1 = lock.newCondition();
    private java.util.concurrent.locks.Condition cd2 = lock.newCondition();
    private java.util.concurrent.locks.Condition cd3 = lock.newCondition();

    public void loopA(int loop){
        lock.lock();
        try{
            if(number !=1){
                cd1.await();
            }
            for(int i =0;i < 1;i++){
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + loop);
            }
            number=2;
            cd2.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            lock.unlock();
        }

    }
    public void loopB(int loop){
        lock.lock();
        try{
            if(number !=2){
                cd2.await();
            }
            for(int i =0;i < 1;i++){
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + loop);
            }
            number=3;
            cd3.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            lock.unlock();
        }

    }
    public void loopC(int loop){
        lock.lock();
        try{
            if(number !=3){
                cd3.await();
            }
            for(int i =0;i < 1;i++){
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + loop);
            }
            number=1;
            cd1.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            lock.unlock();
        }

    }
}

来源于尚硅谷官网JUC视频

猜你喜欢

转载自blog.csdn.net/qq_35241080/article/details/82530913
今日推荐