首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何根据CPU核心来扩展线程?

如何根据CPU核心来扩展线程?
EN

Stack Overflow用户
提问于 2009-12-30 23:47:45
回答 4查看 84.3K关注 0票数 109

我想用Java解决一个多线程的数学问题。我的数学问题可以分成几个工作单元,我想在几个线程中解决它们。

我不希望有固定数量的线程在它上面工作,而是希望有与CPU核心数量相匹配的线程数量。我的问题是,我在互联网上找不到一个简单的教程。我所找到的都是带有固定线程的示例。

如何做到这一点?你能举个例子吗?

EN

回答 4

Stack Overflow用户

发布于 2009-12-31 00:03:54

您可能也想看看这方面的java.util.concurrent框架。类似于:

代码语言:javascript
复制
ExecutorService e = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
// Do work using something like either
e.execute(new Runnable() {
        public void run() {
            // do one task
        }
    });

代码语言:javascript
复制
    Future<String> future = pool.submit(new Callable<String>() {
        public String call() throws Exception {
            return null;
        }
    });
    future.get();  // Will block till result available

这比处理你自己的线程池等要好得多。

票数 65
EN

Stack Overflow用户

发布于 2009-12-31 03:22:38

Doug Lea (并发软件包的作者)有一篇可能相关的论文:http://gee.cs.oswego.edu/dl/papers/fj.pdf

Java SE 7中添加了Fork Join框架。以下是更多参考资料:

Brian Goetz撰写的http://www.ibm.com/developerworks/java/library/j-jtp11137/index.html文章

http://www.oracle.com/technetwork/articles/java/fork-join-422606.html

票数 8
EN

Stack Overflow用户

发布于 2015-11-03 05:23:58

标准方法是Runtime.getRuntime().availableProcessors()方法。在大多数标准CPU上,您将在此处返回最佳线程计数(这不是实际的CPU核心计数)。因此,这就是您正在寻找的。

示例:

代码语言:javascript
复制
ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

不要忘记像这样关闭executor服务(否则您的程序将无法退出):

代码语言:javascript
复制
service.shutdown();

这里只是快速概述一下如何设置基于未来的MT代码(为了说明,脱离主题):

代码语言:javascript
复制
CompletionService<YourCallableImplementor> completionService = 
    new ExecutorCompletionService<YourCallableImplementor>(service);
    ArrayList<Future<YourCallableImplementor>> futures = new ArrayList<Future<YourCallableImplementor>>();
    for (String computeMe : elementsToCompute) {
        futures.add(completionService.submit(new YourCallableImplementor(computeMe)));
    }

然后,您需要跟踪您期望的结果数量,并像这样检索它们:

代码语言:javascript
复制
try {
  int received = 0;
  while (received < elementsToCompute.size()) {
     Future<YourCallableImplementor> resultFuture = completionService.take(); 
     YourCallableImplementor result = resultFuture.get();
     received++; 
  }
} finally {
  service.shutdown();
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1980832

复制
相关文章

相似问题

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