编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的ID 在屏幕上打印10 遍,要求输出的结果必须按顺序显示,如: ABCABCABC…
public class Main {
private static final Object lock = new Object();
// volatile 线程可见性, 多线程情况下变量被修改其他线程能立即感应到
private static volatile int turn = 0; // turn 表示当前轮转到的线程是多少
private static final int TOTAL_COUNT = 10;
public static void main(String[] args) {
// 创建 3个线程
Thread threadA = new Thread(() -> print("A", 0));
Thread threadB = new Thread(() -> print("B", 1));
Thread threadC = new Thread(() -> print("C", 2));
// 分别启动他们
threadA.start();
threadB.start();
threadC.start();
}
private static void print(String message, int threadTurn) {
for (int i = 0; i < TOTAL_COUNT; i++) {
// lock 是锁, 3个线程进行竞争
synchronized (lock) {
// 判断当前线程是否轮转到, 没轮到执行就等待
while (turn != threadTurn) {
try {
lock.wait();
} catch (InterruptedException e) {
// 在捕获到InterruptedException时,会将中断状态重新设置,以确保中断状态不会被忽略,同时允许线程继续执行。
Thread.currentThread().interrupt();
}
}
System.out.print(message);
// 轮转算法
turn = (turn + 1) % 3;
// 唤醒等待的线程
lock.notifyAll();
}
}
}
}