参考文档:https://www.cnblogs.com/linkworld/p/7819270.html
参考视频:
https://www.bilibili.com/video/BV14W411u7gB?from=search&seid=924727718441316160
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Author:CarlosXu
* @Date:2019/10/25
*/
// 编写一个程序,开启3个线程,这三个线程的 ID 分别为 A, B, C, 每个线程将自己的 ID 在屏幕上打印10遍,
// 要求输出的结果必须按顺序显示:
// 如: ABCABCABC... 依次递归
public class TestABCAlernate {
public static void main(String[] args) {
AlernateDemo demo=new AlernateDemo();
//创建三个线程ABC
new Thread(()->{
for (int i=0;i<5;i++){
demo.loopA(i);
}
},"A").start();
new Thread(()->{
for (int i=0;i<5;i++){
demo.loopB(i);
}
},"B").start();
new Thread(()->{
for (int i=0;i<5;i++){
demo.loopC(i);
}
},"C").start();
}
}
class AlernateDemo {
//标记当前正在执行的线程
private int num = 1;
//同步锁
private Lock lock = new ReentrantLock();
//lock锁的唤醒机制
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
//线程A ,total表示循环几轮
public void loopA(int total) {
lock.lock();
try {
if (num != 1) {
//如果不是当前线程,当前线程等待,等待其他线程唤醒
condition1.await();
}
System.out.println(Thread.currentThread().getName() + "===" + num + "===" + total);
//唤醒线程B
num = 2;
condition2.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
//线程B ,total表示循环几轮
public void loopB(int total) {
lock.lock();
try {
if (num != 2) {
//如果不是当前线程,当前线程等待,等待其他线程唤醒
condition2.await();
}
System.out.println(Thread.currentThread().getName() + "===" + num + "===" + total);
//唤醒线程C
num = 3;
condition3.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
//线程C ,total表示循环几轮
public void loopC(int total) {
lock.lock();
try {
if (num != 3) {
//如果不是当前线程,当前线程等待,等待其他线程唤醒
condition3.await();
}
System.out.println(Thread.currentThread().getName() + "===" + num + "===" + total);
//唤醒线程 A
num = 1;
condition1.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}