在Java中实现两个线程交替打印的指南

在多线程编程中,有时我们需要实现不同的线程以特定的顺序执行任务。本文将教你如何在Java中实现两个线程交替打印的功能。我们将使用wait()notify()机制来协调两个线程的行为。接下来,我们将分步骤进行解释,并提供必要的代码示例。

整体流程

以下是实现两个线程交替打印的步骤:

步骤 描述
1 创建两个线程类,分别用于打印奇数和偶数。
2 使用共享对象来控制线程的交替执行。
3 在每个线程执行时,调用wait()notify()进行线程之间的协作。
4 启动线程并观察输出结果。

步骤详解

第一步:创建线程类

我们将创建两个线程类,一个用于打印奇数,另一个用于打印偶数。

class OddThread extends Thread {
    private final Object lock;

    OddThread(Object lock) {
        this.lock = lock;
    }

    public void run() {
        for (int i = 1; i <= 10; i += 2) {
            synchronized (lock) {
                System.out.println("Odd: " + i);
                lock.notify(); // 通知其他线程可以继续执行
                try {
                    lock.wait(); // 当前线程等待,释放锁
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt(); // 如果中断,恢复中断状态
                }
            }
        }
    }
}

class EvenThread extends Thread {
    private final Object lock;

    EvenThread(Object lock) {
        this.lock = lock;
    }

    public void run() {
        for (int i = 0; i <= 10; i += 2) {
            synchronized (lock) {
                System.out.println("Even: " + i);
                lock.notify(); // 通知其他线程可以继续执行
                try {
                    lock.wait(); // 当前线程等待,释放锁
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        }
    }
}

第二步:使用共享对象

为了让两个线程可以协同工作,我们需要一个共享的锁对象来同步它们的行为。我们将其传递给每个线程的构造函数。

public class Main {
    public static void main(String[] args) {
        Object lock = new Object();  // 共享锁对象
        OddThread oddThread = new OddThread(lock);
        EvenThread evenThread = new EvenThread(lock);
        
        oddThread.start(); // 启动奇数线程
        evenThread.start(); // 启动偶数线程
    }
}

第三步:线程协调

在上述代码中,我们使用wait()notify()来实现线程之间的协调。奇数线程先输出一个数字,然后等待偶数线程输出。当偶数线程输出后,它也会等待奇数线程。

关系图

以下是线程之间关系的ER图示例:

erDiagram
    THREAD {
        string name
        string status
    }
    OddThread --|> THREAD
    EvenThread --|> THREAD
    THREAD }o--o{ Lock

状态图

线程的状态转换可以表示如下:

stateDiagram
    [*] --> Running: Starts
    Running --> Waiting: wait()
    Waiting --> Running: notify()
    Running --> [*]: End

总结

以上代码展示了如何在Java中实现两个线程交替打印奇数和偶数。在执行过程中,我们通过wait()notify()方法有效地协调了线程的执行顺序。希望这篇文章能帮助你理解线程间的协作机制,让你在Java多线程编程的道路上迈出重要的一步。练习是学习编程的关键,多尝试不同的场景,你会变得更加熟练!