我是多线程新手,想知道是否可以提供在主线程上工作的核心以从线程池中使用,或者如果我在调用 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/