Java 线程亲和性

新手上路,请多包涵

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

谢谢!

原文由 Dave 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 454
2 个回答

你不能在纯 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 中处理线程关联。它使用与前面提到的相同的方法,但有另一个接口

原文由 BegemoT 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

  1. “jstack-l”
  2. 获取结果,找到我想要手动锁定到核心的线程的“nid”。
  3. Taskset 那些线程。

原文由 Dave 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题