Java中如何让三个线程交替执行并连续打印数字?
三线程交替打印1-12的问题修复
原代码仅能输出1、2、3,核心问题在于:
- 每个线程仅执行一次打印逻辑,没有循环持续执行直到完成12次打印
- 缺乏线程执行顺序的控制逻辑,
notifyAll后无法保证对应线程唤醒执行 PrintNum类中三个print方法冗余,且存在无意义的sleep代码
修改后的完整代码
public class RunAlternateThread { public static void main(String[] args) { PrintNum count = new PrintNum(); Thread t1 = new Thread(new WorkerThread(count, 1)); Thread t2 = new Thread(new WorkerThread(count, 2)); Thread t3 = new Thread(new WorkerThread(count, 3)); t1.start(); t2.start(); t3.start(); } } class WorkerThread implements Runnable { private final PrintNum printNum; private final int threadId; WorkerThread(PrintNum printNum, int threadId) { this.printNum = printNum; this.threadId = threadId; } @Override public void run() { while (printNum.getNum() <= 12) { synchronized (printNum) { // 等待直到轮到当前线程执行 while (printNum.getCurrentThreadId() != threadId) { try { printNum.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } } // 打印当前数字并更新状态 if (printNum.getNum() <= 12) { System.out.println(printNum.getNum()); printNum.incrementNum(); } // 更新下一个要执行的线程ID printNum.setCurrentThreadId(threadId % 3 + 1); // 唤醒所有等待的线程 printNum.notifyAll(); } } } } class PrintNum { private int num = 1; private int currentThreadId = 1; // 初始让线程1执行 public int getNum() { return num; } public void incrementNum() { num++; } public int getCurrentThreadId() { return currentThreadId; } public void setCurrentThreadId(int currentThreadId) { this.currentThreadId = currentThreadId; } }
关键修改点说明
- 统一线程实现:将三个重复的线程类合并为
WorkerThread,通过threadId区分,消除代码冗余 - 循环执行逻辑:每个线程在
run方法中循环,直到num超过12才停止执行 - 顺序控制机制:
PrintNum中新增currentThreadId变量标记当前可执行的线程ID,线程需等待到ID匹配才执行打印 - 避免虚假唤醒:使用
while循环判断执行条件,而非if,防止线程被意外唤醒后错误执行 - 状态流转处理:打印完成后更新数字,并设置下一个要执行的线程ID,确保1→2→3→1的交替顺序
- 安全处理中断:线程等待时捕获
InterruptedException,中断后直接退出,保证线程生命周期安全
内容的提问来源于stack exchange,提问作者guru84
相关产品推荐
相关产品推荐

