首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java对象是否绑定到单个ThreadGroup?

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

Stack Overflow用户
提问于 2013-12-04 14:06:37
回答 2查看 580关注 0票数 2

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

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

见相关问题:为什么我不使用100%?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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%以上。

代码语言:javascript
复制
 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
EN

Stack Overflow用户

发布于 2013-12-04 14:11:45

不,它们不绑定到CPU。但是,如果要使用Java-线程-亲和库进行实验,则可以控制CPU亲和力。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20377507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档