gpt4 book ai didi

java - Java中如何让线程池在不同的核心上运行作业?

转载 作者:行者123 更新时间:2023-12-01 23:00:26 25 4
gpt4 key购买 nike

我有一台16核的机器来运行实验,它是与其他人共享的。我的任务可以很好地划分为完全独立的工作。因此,我创建了一个包含 16 个工作线程的线程池,如下所示(我希望每个工作线程都在单独的核心中运行):

final ExecutorService threadPool = Executors.newFixedThreadPool(16);
final ExecutorCompletionService<Integer> service = new ExecutorCompletionService<Integer>(threadPool);

工作线程只需要在完成时通知主线程。提交的作业数量最多可达数千个。

但是,当我运行 top 来检查进程时,程序实际上一直只在 2 或 3 个核心上运行。一开始我以为原因是有其他人的其他进程,但是我错了。当我运行另一个用 MATLAB 编写的程序时,虽然该程序是顺序的,但它使用了全部 16 个内核。

所以我的程序可以在 16 个核心上并发运行,但它实际上是在 2 或 3 个核心中交错运行。我的问题是如何强制我的Java程序在机器的16个不同核心中运行16个作业?

谢谢。

最佳答案

没有办法让线程池使用特定数量的物理(或逻辑,如果我们考虑英特尔超线程)核心 - 如此低级别的线程调度是由操作系统完成的,而不是由 JVM 完成。

尽管如此,我认为找出池只利用几个核心的原因会更有效率。我的第一个猜测 - 提交到池的任务有问题。为了进一步分析,我建议发布(或至少由您自己查看)Runnable以及将它们提交到线程池的代码。

关于java - Java中如何让线程池在不同的核心上运行作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23437841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com