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



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


有谁能告诉我为什么要使用类Executor吗?由于

不能将线程分配给内核。

  1. Java7的fork/join框架解决了完全相同的问题。不过是自动的(它是为多核处理器设计的)。

  2. 你能做的是设置线程优先级,优先考虑你的线程,如果这是你想要实现的。

  3. JNI可能是另一个出口方向,但我猜是过度杀伤。你可以看看Peter Lawrey的Java-Thread-Affinity,它使用了JNI(我还没用过)。

我想这里最简单的答案就是不能

参见Java线程关联项目。

锁到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.
}

操作系统管理在哪个内核上处理哪些线程。你需要将这些线程分配给操作系统中的单个内核。

例如

。在windows上,打开任务管理器,转到进程选项卡,右键单击java进程…然后将它们分配给特定的核心。

这是你能得到的最好的。

可以为每个线程分配优先级你的要求

我不认为你很容易显式地将线程分配给内核。也许你可以使用本地指令,但我怀疑这是否可行。

除非你在做一些特殊的基准测试,否则你真的不需要。Java线程是由本地线程支持的,如果操作系统足够现代化,它的内核会以一种肯定比你的更好的方式动态地分配(和重新分配)线程到内核,因为它(希望)能够实现负载平衡。

启动一些执行长时间计算的线程,然后从任务管理器中查看处理器使用情况。您将看到许多内核被使用。

你不能。请看这篇文章。JVM将把它委托给操作系统,操作系统将为您处理它。

如前所述,JVM不允许您这样做。但首先,您应该问问自己为什么要考虑将线程分配给内核。这可能不是你想要做的。

Executor类用于调度中等大小的"粒度"计算,而不会产生创建太多线程的开销。您可能还想尝试使用并行分支进行更细粒度的调度,下面是一些代码示例:http://www.ateji.com/px/codesamples.html

最新更新