67

有人知道将Java进程中的单个线程锁定到特定CPU内核(在Linux上)的方法吗?我已经在 C 中完成了此操作,但在 Java 中找不到如何执行此操作。我的直觉是,这将需要一个 JNI 调用,但我希望这里的某个人可能有一些见识,或者可能以前做过。

谢谢!

4

5 回答 5

47

你不能在纯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:经过一番思考,我决定为此创建自己的类:ThreadAffinity.java它是基于 JNA 的,而且非常简单——所以,如果你想在生产中使用它,也许你应该花一些时间来制作它更稳定,但对于基准测试和测试,它可以正常工作。

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

于 2011-08-01T06:39:35.537 回答
9

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

  1. “jstack -l”
  2. 获取结果,找到我想要手动锁定到核心的线程的“nid”。
  3. 任务集那些线程。
于 2011-04-22T15:55:26.597 回答
0

IMO,除非您使用本机调用,否则这是不可能的JVM 应该是独立于平台的,为实现这一点所做的任何系统调用都不会产生可移植的代码。

于 2010-02-10T16:09:02.073 回答
0

这是不可能的(至少对于普通的 Java)。

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

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

于 2010-02-10T16:37:55.110 回答