学习视频资料地址:

https://www.bilibili.com/video/av59548640?p=1;

网盘资料地址:

链接:https://pan.baidu.com/s/1AdZsYnFcDPqrQzQ5BTBqEw 
提取码:uvks

代码示例十:

package com.juchaosoft.test;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 线程按序交替
 * @author wang-xiaoming
 *
 */
public class TestAlternateABC10_01 {
    public static void main(String[] args) {
        AlternateDemo ad = new AlternateDemo();
        // 三个线程同时开启,循环十次并按照线程规定顺序打印ABC
        new Thread(new Runnable() {

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

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

            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    ad.loopC(i, 3);
                    System.out.println("" + (i + 1) + "次执行结束。。");
                }
            }
        }, "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 total, int times){
        lock.lock();

        try {
            // 1、判断线程
            while(number != 1){
                condition1.await();
            }
            // 2、打印
            for (int i = 0; i < times; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total);
            }
            // 3、结束,唤醒下一个线程
            number = 2;

            condition2.signal();
        } catch (Exception e) {
            Thread.currentThread().interrupt();
        } finally {
            lock.unlock();
        }
    }

    public void loopB(int total, int times){
        lock.lock();

        try {
            // 1、判断线程
            while(number != 2){
                condition2.await();
            }
            // 2、打印
            for (int i = 0; i < times; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total);
            }
            // 3、结束,唤醒下一个线程
            number = 3;

            condition3.signal();
        } catch (Exception e) {
            Thread.currentThread().interrupt();
        } finally {
            lock.unlock();
        }
    }

    public void loopC(int total, int times){
        lock.lock();

        try {
            // 1、判断线程
            while(number != 3){
                condition3.await();
            }
            // 2、打印
            for (int i = 0; i < times; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + total);
            }
            // 3、结束,唤醒下一个线程
            number = 1;

            condition1.signal();
        } catch (Exception e) {
            Thread.currentThread().interrupt();
        } finally {
            lock.unlock();
        }
    }
}

console:

A    0    0
B    0    0
B    1    0
C    0    0
C    1    0
C    2    0
第1次执行结束。。
A    0    1
B    0    1
B    1    1
C    0    1
C    1    1
C    2    1
第2次执行结束。。
A    0    2
B    0    2
B    1    2
C    0    2
C    1    2
C    2    2
第3次执行结束。。
A    0    3
B    0    3
B    1    3
C    0    3
C    1    3
C    2    3
第4次执行结束。。
A    0    4
B    0    4
B    1    4
C    0    4
C    1    4
C    2    4
第5次执行结束。。
A    0    5
B    0    5
B    1    5
C    0    5
C    1    5
C    2    5
第6次执行结束。。
A    0    6
B    0    6
B    1    6
C    0    6
C    1    6
C    2    6
第7次执行结束。。
A    0    7
B    0    7
B    1    7
C    0    7
C    1    7
C    2    7
第8次执行结束。。
A    0    8
B    0    8
B    1    8
C    0    8
C    1    8
C    2    8
第9次执行结束。。
A    0    9
B    0    9
B    1    9
C    0    9
C    1    9
C    2    9
第10次执行结束。。
12-25 08:54