面试题:有 3 个独立的线程,一个只会输出 A,一个只会输出 B,一个只会输出 C,在三个线程启动的情况下,请用合理的方式让他们按顺序打印 ABC。

使用join

join() 的核心作用是:让当前线程(通常是主线程)等待调用 join() 的那个线程执行完毕后再继续执行

以下是具体的代码实现和原理解析:

进阶:如果面试官问“能不能不依赖主线程控制顺序?”

上面的解法是主线程在指挥顺序。如果面试官要求“三个线程一旦启动,它们自己内部协调顺序”(即主线程启动完就不管了),那么就不能单纯用上面的 main 方法里的 join 写法,而是要在线程内部互相 join

但对于大多数基础面试题,“在主线程中依次 start 和 join” 是最标准、最容易得分的答案。

但是这种方式只适合 打印一次ABC。

因为 join() 会阻塞当前流程,如果你要循环打印(比如打印 10 次 ABC),这种写法就需要配合复杂的循环和多次创建线程(或者在循环内反复 join),效率较低且代码冗余。

如果要执行多次打印,可以看下面的方案

使用lock,Condition

使用AtomicInteger

使用LockSupprt

线程阻塞唤醒类-LockSupport详解