我使用的是一个用于批处理过程的ThreadPoolExecutor,但是单个JVM上的单个线程池只使用了一个可用服务器的CPU。如果使用一个新的线程池触发一个并行的第二个JVM,我将得到要使用的另一个CPU。
因此,我想知道,ThreadPoolExecutor使用一个底层ThreadGroup作为它的“工作人员”,这些线程是否由于它们属于单个ThreadGroup而绑定到单个ThreadGroup?如果没有,还有其他的想法吗?
见相关问题:为什么我不使用100%?
发布于 2013-12-04 14:09:22
ThreadPoolExecutor使用单个底层ThreadGroup作为其“工作人员”,这些线程是否由于它们属于单个ThreadGroup而绑定到单个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和多核进行调度,但也许您正在进行一种有趣的配置。
发布于 2013-12-04 14:11:45
不,它们不绑定到CPU。但是,如果要使用Java-线程-亲和库进行实验,则可以控制CPU亲和力。
https://stackoverflow.com/questions/20377507
复制相似问题