每日一问 - 两个线程交替打印 ABABAB
作者:互联网
每日一问 - 两个线程交替打印 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
标签:Exception,ABABAB,Thread,void,打印,一问,线程,new,public 来源: https://blog.csdn.net/u013887008/article/details/120447689