Java ThreadGroup对象是否绑定到单个CPU?

时间:2013-12-04 14:06:37

标签: java multithreading jvm threadpool cpu-usage

我正在使用ThreadPoolExecutor,它用于批处理,但单个JVM上的单个线程池只使用1个可用服务器的CPU。如果使用新线程池触发并行的第二个JVM,我将获得另一个要使用的CPU。

所以我想知道,ThreadPoolExecutor为它的“工作者”使用单个底层ThreadGroup,这些线程是否绑定到单个CPU,因为它们属于单个ThreadGroup?如果没有,还有其他想法吗?

请参阅相关问题:Why I'm not using 100%?

2 个答案:

答案 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亲和力。