每日一问 - 两个线程交替打印 ABABAB…
问题
两个线程交替打印 ABABAB... ?
两个线程交替打印 ABABAB 打印 10 次?
解决方案
考的就是线程之间通信问题, 使用 wait, notify
交替打印AB
public class ABCoreHolder {
private boolean flag = true;
public void printA() throws Exception {
synchronized (this) {
while (!flag) {
wait();
}
System.out.print("A");
flag = false;
TimeUnit.SECONDS.sleep(1);
notify();
}
}
public void printB() throws Exception {
synchronized (this) {
while (flag) {
wait();
}
System.out.print("B");
flag = true;
TimeUnit.SECONDS.sleep(1);
notify();
}
}
}
两个线程可以用 notify , 如果多的话,需要用 notifyAll !!
测试用例
/**
* A,B 交替打印
* @throws InterruptedException
*/
public static void abLoop() throws InterruptedException {
final ABCoreHolder holder = new ABCoreHolder();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
holder.printA();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
holder.printB();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
t1.start();
t2.start();
}
结果 :
ABABABABABABABABABABABABABA...
交替打印 10 次 ABAB…
/**
* A,B 交替打印共 10 次
*/
public static void ab10Loop() {
final ABCoreHolder holder = new ABCoreHolder();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
holder.printA();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
holder.printB();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
t1.start();
t2.start();
}
结果:
ABABABABABABABABABAB
Process finished with exit code 0