面试时被问到这个问题,想了会说可以wait和notify来实现,通过了
两个线程,一个打印奇数一个打印偶数,如何让他们并行执行且最终按顺序打印1到100
后来自己想了下如何具体实现
代码:
// 记录当前打印的数字的奇偶
static boolean is_odd = false;
static Object lock = new Object();
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(1);
// 打印奇数的线程
Thread odd_thread = new Thread(() -> {
try {
countDownLatch.await();
for (int i = 1; i < 100; i += 2) {
//获取锁
synchronized (lock) {
// 判断当前打印的是不是奇数,如果是,就wait
while (is_odd) {
lock.wait();
}
System.out.println(i);
// 打印之后给flag赋值
is_odd = true;
lock.notifyAll();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 打印偶数的线程
Thread even_thread = new Thread(() -> {
try {
countDownLatch.await();
for (int i = 2; i < 101; i += 2) {
synchronized (lock) {
while (!is_odd) {
lock.wait();
}
System.out.println(i);
is_odd = false;
lock.notifyAll();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
odd_thread.start();
even_thread.start();
countDownLatch.countDown();
}