有没有人知道如何将Java进程中的各个线程锁定到特定的CPU内核(在Linux上)?我在C中完成了这个,但是在Java中找不到如何做到这一点。我的直觉是这需要一个JNI电话,但我希望这里有人可能有一些见解或者可能以前做过。
谢谢!
答案 0 :(得分:43)
你不能在纯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中有另一个library用于处理线程关联。它使用与前面提到的相同的方法,但有另一个接口
答案 1 :(得分:9)
我知道已经有一段时间了,但如果有人遇到这个帖子,我就是这样解决这个问题的。我写了一个脚本,可以执行以下操作:
答案 2 :(得分:3)
答案 3 :(得分:0)
IMO,除非您使用本机电话,否则不会。 JVM应该是独立于平台的,为实现这一目标而完成的任何系统调用都不会产生可移植的代码。
答案 4 :(得分:0)
这是不可能的(至少使用普通的Java)。
您可以使用thread pools来限制用于不同类型工作的线程(以及因此核心),但无法指定要使用的核心。
甚至有(小)可能性,您的Java运行时不支持您的操作系统或硬件的本机线程。在这种情况下,使用green threads,并且只有一个核心将用于整个JVM。