每日一问 - 两个线程交替打印 ABABAB…(二)
使用 ReentrantLock 实现
public class ABLockHolder {
private boolean flag = false;
private ReentrantLock lock = new ReentrantLock();
public void printA() throws InterruptedException {
try {
lock.lock();
while (!flag) {
System.out.print("A");
flag = true;
TimeUnit.MILLISECONDS.sleep(500);
}
} finally {
lock.unlock();
}
}
public void printB() throws InterruptedException {
try {
lock.lock();
while (flag) {
System.out.print("B");
flag = false;
TimeUnit.MILLISECONDS.sleep(500);
}
} finally {
lock.unlock();
}
}
}
测试用例
public static void abLoop() {
final ABLockHolder holder = new ABLockHolder();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
holder.printA();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
holder.printB();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t1.start();
t2.start();
}
结果:
ABABABABABABABABA...