Java多线程疑问:run()方法中用while替代if为何程序报错?
为什么用
while替代if会报错?核心原因是线程爆炸式创建! 咱们一步一步拆解问题:
1. 报错的while版本:指数级线程增长直接耗尽资源
当你在run()里用while (counter < 51)时,会触发一个恐怖的连锁反应:
- 第一个线程启动后,
run()方法进入循环,疯狂调用newThread()——每次调用都会立刻创建并启动一个新线程,而当前线程不会等新线程执行,直接回到循环继续创建下一个。 - 更糟的是:新启动的线程的
run()方法也会进入同样的while循环,再疯狂创建更多线程。 - 这就变成了「1变2,2变4,4变8…」的指数级增长,瞬间就会超出系统能承载的最大线程数(每个线程都需要分配栈内存),直接抛出
OutOfMemoryError或者IllegalThreadStateException,程序自然崩了。
2. 正常的if版本:线性增长,系统能扛住
换成if (counter < 51)后,逻辑完全不一样:
- 每个线程的
run()方法只会调用一次newThread(),创建一个新线程后,当前线程的生命周期就结束了。 - 线程数量是线性增加的:1→2→3→…→51,不会瞬间爆发,系统资源完全能跟上,所以能正常运行。
3. 把条件放进newThread()就都正常?因为只有单个线程在创建新线程
假设你修改后的代码是把判断逻辑移到newThread()里(比如下面这样):
void newThread() { while (counter < 51) { // 换成if也一样 t = new Thread(this, "Thread: " + Integer.toString(counter)); helloWord(); counter++; t.start(); } } @Override public void run() { newThread(); }
这时候的逻辑是:
- 只有第一个启动的线程会进入循环(因为此时
counter还小于51),它会在自己的线程里按顺序创建新线程,直到counter达到51就停止循环。 - 后续新创建的线程调用
newThread()时,counter已经≥51了,循环(或if判断)直接跳过,不会再创建线程。 - 哪怕用
while,也只是单个线程在控制创建节奏,不会出现指数级爆炸,系统资源完全能承受,所以不会报错。
额外提一句:关于counter的并发问题
你的代码里counter是静态变量且没有同步保护,多个线程同时修改时可能会出现计数重复或遗漏,但这不是你遇到报错的直接原因——核心问题还是线程创建的速度和数量失控。
内容的提问来源于stack exchange,提问作者TutaBugarin
相关产品推荐
相关产品推荐

