面试中经常被遇到一个问题:现在有三个线程,分别执行会打印A,B,C,如何编码使得三个线程顺序执行,即输出‘ABCABC’,这道题看似简单,但是如果对多线程不熟悉或者没有准备还真的不好回答。
下面列举几种比较好理解的方法,代码手工编写,都已测试
lock和Synchronized都是通过线程间的通信,唤醒指定的线程实现顺序执行
1.使用lock
public class Task2Lock {
static Lock lock = new ReentrantLock();
static int count = 0;
static Condition condition1 = lock.newCondition();
static Condition condition2 = lock.newCondition();
static Condition condition3 = lock.newCondition();
/**
* 下面的while只是为了控制打印的次数
* @param args
*/
public static void main(String[] args) {
Thread tA = new Thread(() -> {
while (count < 4) {
//先获取锁
lock.lock();
//如果count取余3不等于0,就await
if (count % 3 != 0) {
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//否则就执行任务并count++,唤醒线程2
System.out.println("a");
count++;
condition2.signal();
lock.unlock();
}
});
Thread tB = new Thread(() -> {
while (count < 4) {
lock.lock();
if (count % 3 != 1) {
try {
condition2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("l");
count++;
condition3.signal();
lock.unlock();
}
});
Thread tC = new Thread(() -> {
while (count < 4) {
lock.lock();
if (count % 3 != 2) {
try {
condition3.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("i");
count++;
condition1.signal();
lock.unlock();
}
});
tA.start();
tB.start();
tC.start();
}
}
2.使用Synchronized
static Objec