Java调用Thread.start()后仅单个线程活跃无法并发问题求助
问题根因
你犯了Java多线程开发中非常典型的错误:错误重写了Thread类的start()方法,且在重写的start()方法中加入了死循环。
要明确两个核心逻辑:
- 你在
main方法里调用threadWhileLoop.start(),这个方法是运行在主线程中的,而非你要启动的子线程 - 原生
Thread类的start()方法作用是向操作系统申请创建子线程,子线程创建成功后会自动调用run()方法执行业务逻辑,正常场景下完全不需要重写start()方法
你现有代码的实际执行流程是:
- 主线程调用重写后的
synchronized start()方法 - 执行
super.start()成功启动子线程,子线程会执行run()里的死循环打印日志 - 主线程继续执行
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(); } } } }
修正后执行逻辑:
- 主线程调用
threadWhileLoop.start(),start()是Thread原生方法,启动子线程后立即返回 - 主线程继续执行后续的死循环,每秒打印主线程日志
- 子线程启动后自动执行
run()方法里的逻辑,每秒打印子线程日志
最终就会出现你预期的两者交替打印的效果
额外注意点
- Java中
Thread类的start()方法是被设计为仅执行一次的线程启动入口,不要随意重写该方法,子线程业务逻辑统一放在run()方法中即可 - 你原有代码中如果保留重写的
start()里的死循环,即使删除了run()方法里的逻辑,主线程依然会被卡死,因为死循环是运行在主线程的调用栈中
内容的提问来源于stack exchange,提问作者Borel
相关产品推荐
相关产品推荐

