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

Java调用Thread.start()后仅单个线程活跃无法并发问题求助

问题根因

你犯了Java多线程开发中非常典型的错误:错误重写了Thread类的start()方法,且在重写的start()方法中加入了死循环。

要明确两个核心逻辑:

  • 你在main方法里调用threadWhileLoop.start(),这个方法是运行在主线程中的,而非你要启动的子线程
  • 原生Thread类的start()方法作用是向操作系统申请创建子线程,子线程创建成功后会自动调用run()方法执行业务逻辑,正常场景下完全不需要重写start()方法

你现有代码的实际执行流程是:

  1. 主线程调用重写后的synchronized start()方法
  2. 执行super.start()成功启动子线程,子线程会执行run()里的死循环打印日志
  3. 主线程继续执行start()方法里你自行添加的死循环,永远卡在这里,根本不会走到后续打印主线程日志的代码段,所以不会出现交替打印的效果

解决方案

删除你重写的start()方法即可,仅保留重写的run()方法存放子线程业务逻辑。
修正后的ThreadWhileLoop类代码如下:

public class ThreadWhileLoop extends Thread {
    @Override
    public void run() {
        super.run();
        while (true){
            System.out.println("ThreadWhileLoopIsRunning");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

修正后执行逻辑:

  1. 主线程调用threadWhileLoop.start(),start()是Thread原生方法,启动子线程后立即返回
  2. 主线程继续执行后续的死循环,每秒打印主线程日志
  3. 子线程启动后自动执行run()方法里的逻辑,每秒打印子线程日志
    最终就会出现你预期的两者交替打印的效果

额外注意点

  • Java中Thread类的start()方法是被设计为仅执行一次的线程启动入口,不要随意重写该方法,子线程业务逻辑统一放在run()方法中即可
  • 你原有代码中如果保留重写的start()里的死循环,即使删除了run()方法里的逻辑,主线程依然会被卡死,因为死循环是运行在主线程的调用栈中

内容的提问来源于stack exchange,提问作者Borel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:39:02