Java线程亲和力

有谁知道将某个Java进程中的单个线程locking到特定的CPU内核(在Linux上)吗? 我已经在C中完成了这个,但是不能在Java中find这个方法。 我的直觉是,这将需要一个JNI电话,但我希望这里有人可能有一些洞察力或可能已经做到了。

谢谢!

你不能在纯Java中做到这一点。 但是,如果你真的需要它 – 你可以使用JNI来调用完成这个工作的本地代码。 这是开始的地方:

http://ovatman.blogspot.com/2010/02/using-java-jni-to-set-thread-affinity.html

http://blog.toadhead.net/index.php/2011/01/22/cputhread-affinity-in-java/

UPD:经过一番思考之后,我决定为这个创build自己的类: ThreadAffinity.java它基于JNA,非常简单 – 所以,如果你想在生产中使用它,可能你应该花一些时间它更稳定,但对于基准testing和testing,它的效果是一样的。

UPD 2:在java中有另一个用于处理线程关联的库 。 它使用与前面提到的相同的方法,但具有另一个接口

我知道这已经有一段时间了,但如果有人遇到这个问题,我就是这样解决这个问题的。 我写了一个脚本,将执行以下操作:

  1. “jstack -l”
  2. 取得结果,find我想要手动locking到核心的线程的“nid”。
  3. 任务设置这些线程。

国际海事组织,这是不可能的,除非你使用本地电话。 JVM应该是独立于平台的,任何系统调用都不会导致可移植的代码。

这是不可能的(至less用普通的Java)。

您可以使用线程池来限制用于不同types工作的线程数量(以及核心数量),但是无法指定要使用的核心。

甚至有(小)的可能性,你的Java运行时不支持你的操作系统或硬件的本地线程。 在这种情况下,使用绿色线程 ,整个JVM只使用一个核心。