我正在使用ThreadPoolExecutor,它用于批处理,但单个JVM上的单个线程池只使用1个可用服务器的CPU。如果使用新线程池触发并行的第二个JVM,我将获得另一个要使用的CPU。
所以我想知道,ThreadPoolExecutor为它的“工作者”使用单个底层ThreadGroup,这些线程是否绑定到单个CPU,因为它们属于单个ThreadGroup?如果没有,还有其他想法吗?
请参阅相关问题:Why I'm not using 100%?
答案 0 :(得分:1)
一个ThreadPoolExecutor为它的“工作者”使用单个底层ThreadGroup,这些线程是否绑定到单个CPU,因为它们属于一个ThreadGroup?
没有。除非您专门更改,否则所有JVM中的所有线程都在同一个ThreadGroup
中。这绝不会改变底层本机线程的调度方式,因此这不是您似乎没有使用多个CPU的原因。
如果没有,还有其他想法吗?
我的第一个回答是质疑它是否真的没有使用多个CPU。如果您正在查看进程的CPU使用率,则可能不会超过100%,因为它阻止了IO。但是,这并不意味着不使用多个CPU。可能是它正在使用许多CPU,只是提交给线程池的任务都没有“CPU绑定”。例如,如果您运行以下应用程序,那么它应该使用多个CPU,并且应该超过100%的CPU利用率(如果您使用的系统测量CPU作为处理器数量的函数)。但是,如果您插入日志记录调用或从网络或磁盘读取,则可能会受到IO的限制,并且无法达到100%以上。
public static void main(String[] args) {
ExecutorService threadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 4; i++) {
threadPool.execute(new Runnable() {
public void run() {
long total = 0;
while (true) {
total++;
}
}
});
}
}
如果使用新线程池触发并行的第二个JVM,我将获得另一个要使用的CPU。
在您的架构上,您的JVM可能无法在多个CPU上进行调度。当然,大多数常见的体系结构和JVM变体都能够安排到所有可用的CPU和多个内核,但是您可能正在使用一个有趣的配置。
答案 1 :(得分:1)
不,他们没有绑定到CPU。但是,如果要使用Java-Thread-Affinity library进行实验,则可以控制CPU亲和力。