21xrx.com
2024-06-03 10:30:19 Monday
登录
文章检索 我的文章 写文章
Java多线程交替打印奇偶数的代码
2023-07-12 15:34:03 深夜i     --     --
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对象的锁,并将当前线程状态置为休眠状态,等待下一次被唤醒。

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

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复