编写一个Java程序,该程序创建两个线程,一个线程用于打印偶数(从2开始),另一 个线程用于打印奇数(从1开始),并且确保两个线程交替打印,直到某个数(例如,打印到 10为止)。
时间: 2024-10-07 08:03:42 浏览: 34
编写一个Java程序来实现这个需求,可以使用synchronized关键字和wait()、notifyAll()方法来协调两个线程的交替打印。下面是一个简单的示例:
```java
public class PrintOddEven {
private int num = 1;
private final Object lock = new Object();
// 线程A:打印偶数
public class PrintEvenThread extends Thread {
@Override
public void run() {
while (num <= 10) {
synchronized (lock) {
if (num % 2 == 0) {
System.out.println(Thread.currentThread().getName() + " 打印偶数:" + num++);
try {
lock.notifyAll();
lock.wait(); // 等待下一个数字
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
lock.wait(); // 如果不是偶数,就等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
// 线程B:打印奇数
public class PrintOddThread extends Thread {
@Override
public void run() {
while (num <= 10) {
synchronized (lock) {
if (num % 2 != 0) {
System.out.println(Thread.currentThread().getName() + " 打印奇数:" + num++);
try {
lock.notifyAll();
lock.wait(); // 同样,等待下一个数字
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
try {
lock.wait(); // 如果不是奇数,就等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public static void main(String[] args) {
PrintOddEven printOddEven = new PrintOddEven();
PrintEvenThread evenThread = printOddEven.new PrintEvenThread();
PrintOddThread oddThread = printOddEven.new PrintOddThread();
evenThread.start();
oddThread.start();
}
}
```
在这个例子中,`PrintEvenThread` 和 `PrintOddThread` 分别代表打印偶数和奇数的线程。它们共享一个锁对象`lock`,通过`synchronized`确保同一时刻只有一个线程访问打印逻辑。当一个线程打印完当前数字,它会唤醒所有等待的线程,并自己进入等待状态,以便让另一个线程继续。
阅读全文