3个线程,线程1输出A,线程2输出B,线程3输出C,让这个3个线程循环有序地输出ABCABC…
看到这个题目,感觉很有意思,问题的本质是在多线程执行环境,控制线程的执行顺序,实现的方式有非常多种,本质上需要解决Java多线程环境下的线程执行的同步和利用锁机制来控制线程的执行顺序。
方式1:利用synchronized
这种方式也就是使用java内置的monitor机制,配合wait和notifyAll,代码如下:
(1)利用volatile做线程间资源的同步访问,同时作为线程调度的标志;
(2)利用notifyAll来唤醒其他等待当前的monitor资源的线程;
public class ThreadOrderWithSync {
private volatile int flag = 'A';
private final static Object LOCK = new Object();
Runnable a = () -> {
while (true) {
synchronized (LOCK) {
if (flag == 'A' ) {
System.out.println("A");
flag = 'B';
// let other thread race to get the monitor
LOCK.notifyAll();
} else {
try {
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
};
Runnable b = () -> {