📌  相关文章
📜  使用Java中的两个线程按递增顺序打印偶数和奇数(1)

📅  最后修改于: 2023-12-03 15:22:18.803000             🧑  作者: Mango

使用Java中的两个线程按递增顺序打印偶数和奇数

在Java中,我们可以通过创建两个线程来轮流打印奇数和偶数。

我们可以通过以下步骤来实现此目标:

  1. 创建一个共享变量count,其初始值为1。
  2. 创建两个线程OddThread和EvenThread。
  3. OddThread负责打印奇数,EvenThread负责打印偶数。
  4. 在这两个线程中,我们使用synchronized关键字来保证资源的互斥访问,从而避免竞争条件和数据不一致性的问题。

下面是基于以上步骤的Java代码实现:

class EvenThread implements Runnable {
    private final Object mutex;
    private static int count;

    public EvenThread(Object mutex) {
        this.mutex = mutex;
        this.count = 2;
    }

    @Override
    public void run() {
        while(count <= 10) {
            synchronized(mutex) {
                System.out.println(Thread.currentThread().getName() + ": " + count);
                count += 2;
                mutex.notify();
                try {
                    mutex.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class OddThread implements Runnable {
    private final Object mutex;
    private static int count;

    public OddThread(Object mutex) {
        this.mutex = mutex;
        this.count = 1;
    }

    @Override
    public void run() {
        while(count <= 9) {
            synchronized(mutex) {
                System.out.println(Thread.currentThread().getName() + ": " + count);
                count += 2;
                mutex.notify();
                try {
                    mutex.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Object mutex = new Object();
        Thread evenThread = new Thread(new EvenThread(mutex), "EvenThread");
        Thread oddThread = new Thread(new OddThread(mutex), "OddThread");

        evenThread.start();
        oddThread.start();

        try {
            evenThread.join();
            oddThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上面的代码中,我们使用了Object对象作为互斥锁(mutex)来保证两个线程互斥访问共享变量count。

首先我们创建一个mutex对象,并将其传递给OddThread和EvenThread的构造函数。

然后,我们分别创建OddThread和EvenThread对象,并将mutex对象作为参数传递给它们的构造函数。

在每个线程的run()方法中,我们使用while循环来打印出count的值,同时使用synchronized(mutex)来保证线程的互斥访问。

在每次计数之后,我们调用mutex.notify()来唤醒另一个线程,然后调用mutex.wait()来等待另一个线程完成打印操作。

最后,在main()方法中,我们启动OddThread和EvenThread,并使用join()方法来等待它们完成打印工作。

输出结果如下:

OddThread: 1
EvenThread: 2
OddThread: 3
EvenThread: 4
OddThread: 5
EvenThread: 6
OddThread: 7
EvenThread: 8
OddThread: 9

这就是使用Java中的两个线程按递增顺序打印偶数和奇数的实现方式。