【发布时间】:2018-07-20 22:45:18
【问题描述】:
我写了一个简单的多线程 java 应用程序,main 方法只创建了 5k 个线程,每个线程将遍历一个有 5M 记录的列表来处理。
我的机器规格:
- CPU核心数:12核
- 内存:13Gb RAM
- 操作系统:Debian 64 位
我的 jar 现在正在运行,我使用 hTop 来监控我的应用程序,这是我在运行时可以看到的
这就是我构建线程的方式:
ExecutorService executor = Executors.newCachedThreadPool();
Future<MatchResult> future = executor.submit(() -> {
Match match = new Match();
return match.find(this);
});
Match.class
find(Main main){
// looping over a list of 5M
// process this values and doing some calculations
// send the result back to the caller
// this function has no problem and it just takes a long time to run (~160 min)
}
现在我有一些问题:
1-根据我的理解,如果我有一个多线程进程,它将充分利用我所有的内核直到任务完成,那么为什么工作负载只有0.5左右(只使用了半个内核)?
2- 为什么我的 Java 应用程序在实际运行并填满日志文件时状态为“S”(睡眠)?
3- 为什么我只能看到 5k 中的 2037 个线程正在运行(这个数字实际上比这个少,并且随着时间的推移而增加)
我的目标:利用所有内核并尽可能快地完成所有这 5k+ :)
【问题讨论】:
-
如果没有看到
Match中的内容,很难知道... -
Match 类是一个非常简单的类,它在所有正在运行的线程中运行,我在我的问题中提供了有关该类的一些细节
-
您说它“实际上正在运行并填满日志文件” - 所有线程都写入同一个文件吗?也许他们正在等待对方完成写作。或者即使他们使用不同的文件,他们也可能在等待日志写入完成时处于休眠状态。 (这只是一个猜测)。
-
另外,如果你有十二个核心,你为什么要创建数千个线程?只能同时运行十二个。
-
所有线程都通过 java.util.Logger 记录到同一个文件(不知道这是否是最佳实践)
标签: java multithreading htop