美文网首页
JUC(八) - 线程按序交替

JUC(八) - 线程按序交替

作者: 21号新秀_邓肯 | 来源:发表于2020-05-18 15:47 被阅读0次

8. 线程按序交替

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

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

    /**
     * A线程
     * @param totalLoop
     */
    public void loopA(int totalLoop) {
        lock.lock();

        try {
            //1.判断
            if (number != 1) {
                condition1.await();
            }
            //2.打印
            for (int i = 1; i <= 1; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
            }

            //3.唤醒
            number = 2;
            condition2.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    /**
     * B线程
     * @param totalLoop
     */
    public void loopB(int totalLoop) {
        lock.lock();

        try {
            //1.判断
            if (number != 2) {
                condition2.await();
            }
            //2.打印
            for (int i = 1; i <= 1; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
            }

            //3.唤醒
            number = 3;
            condition3.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    /**
     * C线程
     * @param totalLoop
     */
    public void loopC(int totalLoop) {
        lock.lock();

        try {
            //1.判断
            if (number != 3) {
                condition3.await();
            }
            //2.打印
            for (int i = 1; i <= 1; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
            }

            //3.唤醒
            number = 1;
            condition1.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

测试

    public static void main(String[] args) {
        final AlternateDemo ad  = new AlternateDemo();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    ad.loopA(i);
                }
            }
        }, "A").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    ad.loopB(i);
                }
            }
        }, "B").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    ad.loopC(i);
                }
            }
        }, "C").start();
    }

相关文章

  • JUC(八) - 线程按序交替

    8. 线程按序交替 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为A、B、C,每个线程将自己的 ID ...

  • 一、什么是JUC

    1、JUC简介 在 Java 中,线程部分是一个重点,本篇文章说的 JUC 也是关于线程的。JUC 就是 java...

  • 震撼来袭!京东架构师手写JUC技术笔记,看过的人都说好!

    什么是JUC 在Java中,线程部分是一个重点,本篇文章说的JUC也是关于线程的。JUC就是java.util ....

  • JUC

    * 1、JUC的概念 1.1什么事JUC 1.2.1:进行与线程 1.2.2:线程的基本状态 (1)NEW新建 (...

  • Chapter 16 . JUC 线程高级

    阅读原文 Chapter 16 . JUC 线程高级 16.1 Java JUC 简介 在 Java 5.0 提...

  • JUC(十) - 线程八锁

    10. 线程八锁 一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个s...

  • JUC

    前言: 在Java中,线程部分是一个重点,本篇文章说的JUC也是关于线程的。JUC就是java.util .con...

  • 高并发编程06 ~ AQS:AbstractQueuedSych

    前面的章节中,我们已经解除到了JUC,JUC可以大大的提高线程的安全性,而JUC的核心则是AQS。 AQS底层原理...

  • 多线程juc线程池

    java_basic juc线程池 创建线程池 handler是线程池拒绝策略 排队策略 线程池状态 RUNNIN...

  • 多线程 按序打印

    https://leetcode-cn.com/problems/print-in-order/ 我们提供了一个类...

网友评论

      本文标题:JUC(八) - 线程按序交替

      本文链接:https://www.haomeiwen.com/subject/mvucohtx.html