两个线程交替打印0~100的奇偶数?
参考答案:
在Java中,你可以使用两个线程来交替打印0到100的奇数和偶数。你可以使用wait()
和notify()
或notifyAll()
方法来实现线程间的同步。这里有一个示例代码:
public class OddEvenPrinter {
private int number = 0;
private final Object lock = new Object();
private boolean isOddTurn = true;
public static void main(String[] args) {
OddEvenPrinter printer = new OddEvenPrinter();
Thread oddThread = new Thread(() -> {
printer.printOdds();
});
Thread evenThread = new Thread(() -> {
printer.printEvens();
});
oddThread.start();
evenThread.start();
}
public void printOdds() {
while (number <= 100) {
synchronized (lock) {
while (!isOddTurn) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (number % 2 != 0) {
System.out.println(Thread.currentThread().getName() + " printed: " + number);
number++;
isOddTurn = false;
lock.notifyAll();
}
}
}
}
public void printEvens() {
while (number <= 100) {
synchronized (lock) {
while (isOddTurn) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (number % 2 == 0) {
System.out.println(Thread.currentThread().getName() + " printed: " + number);
number++;
isOddTurn = true;
lock.notifyAll();
}
}
}
}
}
在这个代码中,我们创建了一个OddEvenPrinter
类,它包含一个用于同步的lock
对象和一个number
变量来跟踪当前的数字。isOddTurn
变量用于确定当前是奇数线程还是偶数线程的回合。
我们创建了两个线程,一个用于打印奇数,另一个用于打印偶数。每个线程都运行一个无限循环,直到number
超过100。在每次迭代中,线程都会获取lock
对象的锁,并检查是否是它的回合(奇数线程检查isOddTurn
是否为true
,偶数线程检查isOddTurn
是否为false
)。如果不是它的回合,线程会调用lock.wait()
方法等待,直到它被唤醒。
当线程发现是它的回合时,它会检查当前的number
是否是它应该打印的数字(奇数线程检查number
是否为奇数,偶数线程检查number
是否为偶数)。如果是,它会打印该数字,将number
增加1,更改isOddTurn
的值以表示回合已经切换,然后调用lock.notifyAll()
方法唤醒所有等待的线程。
注意,这个代码示例使用了wait()
和notifyAll()
方法,这些方法是Java的内置线程同步机制。你也可以使用Java并发库中的其他工具,如Semaphore
或CyclicBarrier
,来实现类似的功能。