问题
给出两个线程,要求两个线程交替打印从1到100,例如:A线程打印1,B线程打印2,A线程打印3...依次类推,直到打印到100
思路
这里主要是考察对java中wait/notifyAll机制的理解,可以开启两个线程,循环对数字进行自增,同时设置一个标记位,标记A线程是否对数字进行自增和打印,循环监听该标记位的值,如果已经打印完成,则将A线程置为等待状态,同时调用notifyAll,通知其它线程唤醒,线程B的操作与线程A相反
代码实现
public class NumTest {
static Object object = new Object();
static int num = 0;
static volatile boolean aPrint = false;
static class A implements Runnable {
@Override
public void run() {
while (num < 99) {
synchronized (object) {
while (aPrint) {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
num++;
System.out.println(String.format("线程%s打印数字%d", Thread.currentThread().getName(), num));
aPrint = true;
object.notifyAll();
}
}
}
}
static class B implements Runnable {
@Override
public void run() {
while (num < 99) {
synchronized (object) {
while (!aPrint) {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
num++;
System.out.println(String.format("线程%s打印数字%d", Thread.currentThread().getName(), num));
aPrint = false;
object.notifyAll();
}
}
}
}
public static void main(String[] args) {
Thread threadA = new Thread(new A());
threadA.setName("threadA");
Thread threadB = new Thread(new B());
threadB.setName("threadB");
threadA.start();
threadB.start();
}
}
运行结果(部分):
image.png
这里解释一下为什么while里面的判断要用 num < 99,我们设想一下当num自增到98时,一定是有一个线程处理wait状态,此时另一个线程做自增时,num变成了99,随后执行notifyAll唤醒wait的线程,wait的线程苏醒后继续向下执行,再自增一次得到正确结果