java - 可以暂停主线程或操作系统线程以提高并行计算速度吗?

标签 java multithreading

我是多线程新手,想知道是否可以提供在主线程上工作的核心以从线程池中使用,或者如果我在调用 invokeAll 时使用 ExecutorService ,这种情况是否会自动发生?

我提出这个问题是因为我的性能测试显示,在固定线程池中使用 3 或 4 个线程时,最大加速约为 2.7

但是运行时说我有 4 个可用处理器(由于 corei3 上的超线程),所以我希望获得接近 4 的加速

或者我的操作系统是否需要至少占用一个核心?

MWE:

private void doParallel() {

  List<Callable<Object>> jobs = new ArrayList<Callable<Object>>(threadCount);
  for (int i = 0; i < threadCount; i++) {
    jobs.add(new Callable<Object>() {
       @Override
       public Object call() {
         // compute something heavy
         return null;
       }
    });      
  }
  // is it possible to pause the main thread here to make one
  // additional core available for the threadPool?
  threadPool.invokeAll(jobs); // TODO Exception
}

最佳答案

作为理论练习:

第 1 步:在线程中添加一些有意义的(现实世界)执行逻辑,其中可能还涉及某种 I/O、网络访问或数据库访问。

第 2 步:从线程数 1 开始,增加到 10 或 20,针对每个线程数执行并分析程序

第 3 步:重复此操作 3-4 次,然后查看每个线程计数的平均统计数据,您将找到适合您的计算机执行特定任务的“最佳”位置。

这只能作为学习练习,在大多数情况下,您只需设置并行线程数 = 核心数即可。

关于java - 可以暂停主线程或操作系统线程以提高并行计算速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31270174/

相关文章:

java - Eclipse - 缺少 Maven 依赖项

java - Android 如何在我的 baseadapter 中获取 ArrayList Hashmap 的值

java - JavaFx并发事件

multithreading - 如何防止卡住MainForm并等待子线程的返回值

java - 在 Java 抽象类中创建新对象

java - Hibernate映射异常: One to None Mapping

.net - 从 .NET 中的另一个线程更改 UI 元素

java - 为什么执行器不关闭?

multithreading - 默认调度策略和新QNX进程/线程的优先级

java - 如何在 WeldListener 中捕获 isHexDigit 异常?