题目要求多线程循环打印a,b,c1.示例1输入3输出ABCABCABC2.示例2输入5输出ABCABCABCABCABC附代码class PrintABC { private int state 0; // 状态计数器决定轮到谁打印 // 可重入锁可以实现精准唤醒即A打印完唤醒BB打印完唤醒CC打印完唤醒A // 因此使用ReentrantLock Condition实现条件等待/唤醒 // Synchronized只能配合wait()/notify()而notify()是随机唤醒一个等待线程无法指定唤醒B或C private final ReentrantLock lock new ReentrantLock(); // 可重入锁 // 三个条件变量 private final Condition conditionA lock.newCondition(); private final Condition conditionB lock.newCondition(); private final Condition conditionC lock.newCondition(); public void printA() { lock.lock(); // 获取锁 try { // 用while不用if每次唤醒都重新检查条件 // 防止虚假唤醒 while (state % 3 ! 0) { // 如果不是A的回合 conditionA.await(); // A线程等待 } System.out.print(A); // 打印A state; // 状态1 conditionB.signal(); // 唤醒B线程 // 重新设置中断标志 } catch (InterruptedException e) { // 当捕获到中断异常后重新设置当前线程的中断状态为true // 方便上层代码在检查状态的时候能知道线程被中断了并做相应的处理 // 之所以叫重新设置中断状态是因为JVM在每次抛出InterruptedException前会自动清除InterruptedException为false Thread.currentThread().interrupt(); } finally { lock.unlock(); // 释放锁 } } public void printB() { lock.lock(); // 获取锁 try { while (state % 3 ! 1) { // 如果不是B的回合 conditionB.await(); // B线程等待 } System.out.print(B); // 打印B state; // 状态1 conditionC.signal(); // 唤醒C线程 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); // 释放锁 } } public void printC() { lock.lock(); // 获取锁 try { while (state % 3 ! 2) { // 如果不是C的回合 conditionC.await(); // C线程等待 } System.out.println(C); // 打印C state; // 状态1 conditionA.signal(); // 唤醒A线程 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); // 释放锁 } } }ACM模式import java.util.Scanner; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; class PrintABC { private int state 0; // 状态计数器决定轮到谁打印 // 可重入锁可以实现精准唤醒即A打印完唤醒BB打印完唤醒CC打印完唤醒A // 因此使用ReentrantLock Condition实现条件等待/唤醒 // Synchronized只能配合wait()/notify()而notify()是随机唤醒一个等待线程无法指定唤醒B或C private final ReentrantLock lock new ReentrantLock(); // 可重入锁 // 三个条件变量 private final Condition conditionA lock.newCondition(); private final Condition conditionB lock.newCondition(); private final Condition conditionC lock.newCondition(); public void printA() { lock.lock(); // 获取锁 try { // 用while不用if每次唤醒都重新检查条件 // 防止虚假唤醒 while (state % 3 ! 0) { // 如果不是A的回合 conditionA.await(); // A线程等待 } System.out.print(A); // 打印A state; // 状态1 conditionB.signal(); // 唤醒B线程 // 重新设置中断标志 } catch (InterruptedException e) { // 当捕获到中断异常后重新设置当前线程的中断状态为true // 方便上层代码在检查状态的时候能知道线程被中断了并做相应的处理 // 之所以叫重新设置中断状态是因为JVM在每次抛出InterruptedException前会自动清除InterruptedException为false Thread.currentThread().interrupt(); } finally { lock.unlock(); // 释放锁 } } public void printB() { lock.lock(); // 获取锁 try { while (state % 3 ! 1) { // 如果不是B的回合 conditionB.await(); // B线程等待 } System.out.print(B); // 打印B state; // 状态1 conditionC.signal(); // 唤醒C线程 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); // 释放锁 } } public void printC() { lock.lock(); // 获取锁 try { while (state % 3 ! 2) { // 如果不是C的回合 conditionC.await(); // C线程等待 } System.out.println(C); // 打印C state; // 状态1 conditionA.signal(); // 唤醒A线程 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); // 释放锁 } } } public class Main { public static void main(String[] args) throws InterruptedException { Scanner scanner new Scanner(System.in); // 读取打印次数 int n scanner.nextInt(); PrintABC printABC new PrintABC(); // 创建三个线程 // new Thread()里的内容 // () - {...}表示Lambda表达式表示线程要执行的任务代码 // 这里线程要执行的任务是重复执行n次每次循环调用printABC.printA()方法 // 其中printA()方法负责打印A并唤醒下一个线程 Thread threadA new Thread(() - { for (int i 0; i n; i) { printABC.printA(); } }); Thread threadB new Thread(() - { for (int i 0; i n; i) { printABC.printB(); } }); Thread threadC new Thread(() - { for (int i 0; i n; i) { printABC.printC(); } }); // 启动线程 threadA.start(); threadB.start(); threadC.start(); // 等待所有线程结束 threadA.join(); threadB.join(); threadC.join(); scanner.close(); } }