我正在用java编写一个涉及并行计算的应用程序。 我的问题是如何明确地将线程分配给核心?它的编程逻辑是什么?
有谁可以告诉为什么使用类Executor?感谢
答案 0 :(得分:9)
您无法将线程分配给核心。
Java7的fork/join framework解决了完全相同的问题。自动(它将设计用于多核处理器)。
您可以做的是设置Thread priority以确定线程的优先级,如果这是您想要实现的目标。
JNI可能是出口的另一个方向,但我认为这有点过分。你可以看看使用JNI的Peter Lawrey的Java-Thread-Affinity(我还没用过它)。
答案 1 :(得分:5)
我认为这里简单的答案就是 不能 。
答案 2 :(得分:2)
我认为将线程明确地分配给核心并不容易。也许你可以使用原生指令,但我怀疑它是否可以完成。
除非你正在做一些特殊的基准测试,否则你真的不需要。 Java线程由本机线程支持,如果是O.S.它足够现代,它的内核将以一种肯定比你更好的方式动态地为线程分配(并重新分配)线程,因为它(希望)能够实现负载平衡。
启动一些执行长计算的线程,然后从任务管理器查看处理器使用情况。你会看到使用了很多核心。
答案 3 :(得分:2)
你做不到。 See this article。 JVM会将此委托给操作系统,操作系统将为您处理。
答案 4 :(得分:2)
操作系统管理在哪个核心上处理哪些线程。您需要将线程分配给操作系统中的单个核心。
例如。在Windows上,打开任务管理器,转到进程选项卡,然后右键单击java进程...然后将它们分配给特定的核心。
这是你最好的。
您可以按照指定线程优先级 你的要求
答案 5 :(得分:2)
请参阅Java Thread Affinity项目。
锁定到CPU
try (AffinityLock al = AffinityLock.acquireLock()) {
// do some work while locked to a CPU.
}
锁定核心:
try (AffinityLock al = AffinityLock.acquireCore()) {
// do some work while locked to a CPU.
}
答案 6 :(得分:1)
如上所述,JVM不会让你。但首先,您应该问问自己为什么要考虑将线程分配给核心。这可能不是你想要做的。
Executor类用于计划中等大小的“粒度”计算,而不会产生创建太多线程的开销。您可能还想尝试使用并行分支进行更细粒度的调度,以下是一些代码示例:http://www.ateji.com/px/codesamples.html