两个线程交替打印1-100的奇偶数
时间: 2024-10-17 11:07:31 浏览: 39
Java实现多线程轮流打印1-100的数字操作
两个线程交替打印1到100之间的奇数和偶数可以通过Java的synchronized关键字和wait(), notify()机制来实现。这通常称为生产者-消费者模型,其中一个线程负责生成数字并将其放入共享队列,另一个线程负责从队列取出数字并打印。
首先,创建一个共享队列和两个线程:
1. 生产者线程(OddThread):
- 初始化计数器和标志变量,控制打印偶数或奇数。
- 当计数器为偶数时,将当前奇数入队,并唤醒等待打印偶数的消费者线程。
- 使用`synchronized`确保对队列的操作互斥。
2. 消费者线程(EvenThread):
- 入队前检查是否需要打印偶数,如果不需要则进入等待状态。
- 获取队列中的下一个数并打印,然后变为下一个线程的角色(即打印奇数)。
- 调用`notify()`通知生产者切换角色。
下面是简化版的伪代码示例:
```java
class PrintNumber {
private int count = 1;
private Queue<Integer> queue = new LinkedList<>();
private boolean isOddProducer;
synchronized void produce() {
while (count <= 100) {
if (isOddProducer) {
// 生产奇数
queue.offer(count++);
isOddProducer = false;
notify();
} else {
try {
wait(); // 等待消费者打印偶数
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
synchronized void consume() {
while (queue.isEmpty()) {
try {
wait(); // 如果队列为空,则等待
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
System.out.println(queue.poll()); // 打印并移除队首元素
if (queue.isEmpty()) { // 切换角色
isOddProducer = true;
notifyAll(); // 唤醒所有等待的线程
}
}
}
PrintNumber printer = new PrintNumber();
new Thread(printer::produce, "Producer").start();
new Thread(printer::consume, "Consumer").start();
```
阅读全文