我想测试一些ThreadPool功能,但我遇到程序行为,我无法解释。我的池没有执行所有线程,只有少数启动,然后挂起。
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class WorkerRunnable implements Runnable {
private static AtomicInteger ai = new AtomicInteger();
public void run() {
int n = ai.incrementAndGet();
printMsg("Starting Thread: " + n);
for (int i = Integer.MAX_VALUE; i > 0; i--)
for (int j = Integer.MAX_VALUE; j > 0; j--)
for (int k = Integer.MAX_VALUE; k > 0; k--);
printMsg("Finishing Thread: " + n);
}
private static synchronized void printMsg(String msg) {
System.out.println(msg);
System.out.flush();
}
public static void main(String[] args) throws InterruptedException {
Executor pool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10000; i++)
pool.execute(new WorkerRunnable());
}
}
在大多数情况下,以前的代码只会导致前5个线程的开始。我无法弄清楚为什么它会挂掉并且没有完成任何可运行的任务。在某些情况下,它会执行所有工作人员,但在大多数情况下,我得到的唯一结果是:
Starting Thread: 1
Starting Thread: 3
Starting Thread: 2
Starting Thread: 4
Starting Thread: 5
编辑:
这是关于如何编译JIT编译器和x86指令的合理问题。一旦优化器意识到for循环没有做任何事情然后优化它,该程序将实际执行。了解为什么这种情况在某些情况下有效而在其他情况下无效是很重要的。这是因为for循环需要花费大量时间,但后来进行了优化。