我可以访问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个作业?
谢谢。
答案 0 :(得分:3)
没有办法让线程池使用一些特定数量的物理(或逻辑,如果我们考虑Intel HyperThreading)内核 - 这种低级别的线程调度由OS完成,而不是由JVM完成。
尽管如此,我认为找出这个池为什么只使用几个核心会更有效率。我的第一个猜测 - 提交给池的任务有问题。为了进一步分析,我建议发布(或至少自己查看)Runnable
以及将它们提交给线程池的代码。
答案 1 :(得分:0)
有些相关,根据具体问题,线程关联库可能会有所帮助,例如:
http://openhft.net/products/thread-affinity/
这将允许您控制特定线程使用的cpu和核心。如果主线程是潜在的瓶颈,您可以使用它来防止它被暂停。