跳到主要内容

两个线程交替打印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并发库中的其他工具,如SemaphoreCyclicBarrier,来实现类似的功能。