面试时被问到这个问题,想了会说可以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();
}
该文章描述了一个面试问题,即如何使用Java的线程同步机制让两个线程交替打印1到100的奇偶数。解决方案涉及到了wait(),notifyAll()方法以及一个共享锁对象和一个标志位is_odd来跟踪当前应打印的数字类型。同时使用CountDownLatch确保两个线程同时开始执行。
333

被折叠的 条评论
为什么被折叠?



