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,可以帮助我们更好地处理线程间的同步和协作,提高程序的可靠性和性能。