You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:10:55