Java多线程 - 将线程分配给处理器核心

时间:2011-05-04 06:22:00

标签: java multithreading

我正在用java编写一个涉及并行计算的应用程序。 我的问题是如何明确地将线程分配给核心?它的编程逻辑是什么?


有谁可以告诉为什么使用类Executor?感谢

7 个答案:

答案 0 :(得分:9)

您无法将线程分配给核心。

  1. Java7的fork/join framework解决了完全相同的问题。自动(它将设计用于多核处理器)。

  2. 您可以做的是设置Thread priority以确定线程的优先级,如果这是您想要实现的目标。

  3. 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