21xrx.com
2025-06-14 00:05:55 Saturday
文章检索 我的文章 写文章
Java多线程交替打印奇偶数的代码
2023-07-12 15:34:03 深夜i     30     0
Java 多线程 交替打印 奇偶数 代码

在Java程序中,多线程是一个非常实用的特性。它允许我们同时执行多个任务,从而提高程序的效率。其中,交替打印奇偶数是一个经典的多线程问题,今天我们来学习一下如何实现这个问题的解决方案。

我们可以通过使用两个线程来实现这个问题。一个线程负责打印奇数,另一个线程负责打印偶数。在代码中,我们可以使用两个变量来记录当前打印的奇数和偶数,然后让两个线程分别打印奇数和偶数。

以下是Java多线程交替打印奇偶数的代码:

public class PrintOddEven {
  private static int count = 1; // 用于记录当前需要打印的数字
  private static final Object lock = new Object();
  public static void main(String[] args) {
    Thread oddThread = new Thread(new PrintOdd());
    Thread evenThread = new Thread(new PrintEven());
    oddThread.start();
    evenThread.start();
  }
  static class PrintOdd implements Runnable {
    @Override
    public void run() {
      while (count <= 100) {
        synchronized (lock) {
          if (count % 2 != 0) {
            System.out.println("奇数:" + count);
            count++;
          }
          lock.notify();
          try {
            lock.wait(); // 释放lock对象的锁,将当前线程置入休眠状态
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }
  }
  static class PrintEven implements Runnable {
    @Override
    public void run() {
      while (count <= 100) {
        synchronized (lock) {
          if (count % 2 == 0) {
            System.out.println("偶数:" + count);
            count++;
          }
          lock.notify();
          try {
            lock.wait(); // 释放lock对象的锁,将当前线程置入休眠状态
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }
  }
}

在上面的代码中,我们定义了一个静态变量count并将其初始值设为1,作为我们需要输出的奇偶数的起始值。我们使用了一个共享对象lock作为多个线程之间同步的锁,来保证输出顺序的正确性。

在PrintOdd线程中,如果count为奇数,则输出奇数并将count加1,然后调用lock.notify()方法唤醒等待lock对象锁的线程。接着,当前线程调用lock.wait()方法释放lock对象的锁,并将当前线程状态置为休眠状态,等待下一次被唤醒。

在PrintEven线程中,如果count为偶数,则输出偶数并将count加1,然后同样调用lock.notify()方法唤醒等待lock对象锁的线程。接着,当前线程调用lock.wait()方法释放lock对象的锁,并将当前线程状态置为休眠状态,等待下一次被唤醒。

通过这种方式,我们可以让两个线程交替打印奇偶数,并保证输出顺序的正确性。

  
  

评论区