Java如何让两个线程交替执行

在软件开发中,我们经常会遇到需要两个线程交替执行的情况,这种情况通常需要使用同步机制来协调两个线程的执行顺序。在Java中,我们可以使用synchronized关键字或者Lock来实现线程间的同步。

问题描述

假设有两个线程,分别为A和B,需要交替执行打印数字1到10,即A线程打印1,B线程打印2,A线程打印3,B线程打印4,以此类推,直到打印完成数字10。

解决方案

我们可以使用一个共享的变量来控制两个线程的执行顺序,当共享变量的值为奇数时,A线程执行打印操作;当共享变量的值为偶数时,B线程执行打印操作。同时,使用synchronized关键字来保证线程间的同步。

public class AlternateThreadExecution {

    private static final Object lock = new Object();
    private static int count = 1;
    private static final int MAX_COUNT = 10;

    public static void main(String[] args) {
        Thread threadA = new Thread(() -> {
            while (count <= MAX_COUNT) {
                synchronized (lock) {
                    if (count % 2 != 0) {
                        System.out.println("Thread A: " + count++);
                        lock.notify();
                    } else {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });

        Thread threadB = new Thread(() -> {
            while (count <= MAX_COUNT) {
                synchronized (lock) {
                    if (count % 2 == 0) {
                        System.out.println("Thread B: " + count++);
                        lock.notify();
                    } else {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });

        threadA.start();
        threadB.start();
    }
}

在上面的代码中,我们创建了两个线程threadA和threadB,分别负责打印奇数和偶数。使用synchronized关键字来保证线程间的同步,当共享变量count为奇数时,A线程打印数字,并唤醒等待中的B线程;当count为偶数时,B线程打印数字,并唤醒等待中的A线程。

交替执行过程示意图

journey
    title Java线程交替执行示意图
    section 线程A
        A(开始)
        A --> B: 打印1
        B --> C: 等待
    section 线程B
        C(开始)
        C --> D: 等待
        D --> E: 打印2

通过上面的代码示例和交替执行过程示意图,我们可以清晰地了解如何实现两个线程的交替执行。在实际开发中,我们可以根据具体需求进行适当的修改和扩展,以实现更加复杂的线程交替执行逻辑。Java提供了丰富的并发工具和API,可以帮助我们更好地处理线程间的同步和协作,提高程序的可靠性和性能。