21xrx.com
2024-11-10 00:13:32 Sunday
登录
文章检索 我的文章 写文章
Java多线程交替打印奇偶数,代码是否相同?
2023-07-01 19:12:38 深夜i     --     --
Java 多线程 交替打印 奇偶数 代码相同

Java多线程是一种非常强大的编程技术,它能够实现程序的多任务运行,提高程序的执行效率,让程序在同一时间内执行多个任务。其中,交替打印奇偶数是多线程编程中常见的问题之一,本文将会分析Java多线程交替打印奇偶数,并探讨其中的一些细节。

首先,我们来看一段简单的Java多线程交替打印奇偶数的代码:


public class PrintOddEven {

  static class Printer implements Runnable {

    int num;

    Object lock;

    public Printer(int num, Object lock)

      this.num = num;

      this.lock = lock;

    

    @Override

    public void run() {

      while (num <= 10) {

        synchronized (lock) {

          System.out.println(Thread.currentThread().getName() + ":" + num);

          num += 2;

          lock.notify();

          try {

            lock.wait();

          } catch (InterruptedException e) {

            e.printStackTrace();

          }

        }

      }

      synchronized (lock) {

        lock.notify();

      }

    }

  }

  public static void main(String[] args) {

    Object lock = new Object();

    Thread t1 = new Thread(new Printer(1, lock), "t1");

    Thread t2 = new Thread(new Printer(2, lock), "t2");

    t1.start();

    t2.start();

  }

}

在该代码中,我们首先定义了一个Printer类,该类实现了Runnable接口,其中包含num和lock两个属性,num用来记录当前要打印的数字,lock则是一个对象锁,用来协调两个线程的执行。在run方法中,我们使用synchronized同步代码块来保证线程安全,当num小于等于10时,先打印出当前数字,然后将num加2,然后调用lock.notify()方法唤醒另一个线程,自己则进入等待状态,等待另一个线程将其唤醒。当num大于10时,我们再次调用lock.notify()方法,将另一个线程唤醒,然后该线程结束运行。

接着,我们来看另一段Java多线程交替打印奇偶数的代码:


public class PrintOddEven {

  public static void main(String[] args) {

    new Thread(new Printer(1), "t1").start();

    new Thread(new Printer(2), "t2").start();

  }

  static class Printer implements Runnable {

    private static int num = 1;

    private static Object lock = new Object();

    private int threadId;

    public Printer(int threadId)

      this.threadId = threadId;

    

    @Override

    public void run() {

      synchronized (lock) {

        while (num < 10) {

          if (num % 2 == threadId - 1) {

            System.out.println(Thread.currentThread().getName() + ":" + num);

            num++;

            lock.notifyAll();

          } else {

            try {

              lock.wait();

            } catch (InterruptedException e) {

              e.printStackTrace();

            }

          }

        }

        lock.notifyAll();

      }

    }

  }

}

与第一段代码不同的是,在这段代码中,我们使用了静态属性num和lock来控制线程的执行。在run方法中,我们使用while循环来判断num是否小于10,如果小于10,则判断当前线程是否应该输出数字,如果是,则输出数字并将num加1,然后使用lock.notifyAll()方法唤醒所有等待的线程。否则,当前线程进入等待状态,等待其他线程的唤醒。当num大于等于10时,所有线程退出等待状态,程序结束运行。

从代码实现来看,这两段代码的思路是类似的,都是使用synchronized同步代码块或wait/notify方法来实现线程的同步和协调。但是两段代码中也存在一些细节上的差异,例如第一段代码中使用了打印器类来记录num和lock,而第二段代码中则使用了静态属性来控制线程的执行;同时,第一段代码使用了lock.notify()方法唤醒另一个线程,而第二段代码则使用了lock.notifyAll()方法唤醒所有等待的线程。因此,在实际编程中,需要根据具体情况选择不同的实现方式。

总之,Java多线程交替打印奇偶数是多线程编程中常见的问题之一,通过学习上述两段代码的实现,我们可以更好地掌握Java多线程的编程技巧,提高程序的执行效率,更好地实现多任务处理。

  
  

评论区

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