如何设置Java线程';cpu核心亲和力?
我搜索了以前关于类似主题的帖子,但找不到合适的答案,因此提出了这个问题。非常感谢您的帮助 我知道在Linux中通过taskset命令设置进程与特定CPU核心的关联性。但是我想设置一个Java线程与特定cpu核心的关联性,以便属于同一进程的其他线程可以在所有剩余的核心上运行。例如,如果我有一个进程包含10个线程和4核机器,我想为一个线程保留core-1,并让剩余的9个线程在剩余的3核机器上运行。这能做到吗?如何做到 谢谢如何设置Java线程';cpu核心亲和力?,java,linux,Java,Linux,我搜索了以前关于类似主题的帖子,但找不到合适的答案,因此提出了这个问题。非常感谢您的帮助 我知道在Linux中通过taskset命令设置进程与特定CPU核心的关联性。但是我想设置一个Java线程与特定cpu核心的关联性,以便属于同一进程的其他线程可以在所有剩余的核心上运行。例如,如果我有一个进程包含10个线程和4核机器,我想为一个线程保留core-1,并让剩余的9个线程在剩余的3核机器上运行。这能做到吗?如何做到 谢谢 Sachin不幸的是,您无法将Java线程分配给特定的核心。但是,您可以做的
Sachin不幸的是,您无法将Java线程分配给特定的核心。但是,您可以做的是设置线程的优先级(假设这将完成相同的任务)
或者,您可以使用JNI,但这完全是多余的 请记住,您运行的Java应用程序实际上是在JVM中运行的,而JVM又运行在操作系统上。为了能够直接与CPU交互,您需要一种低级编程语言(例如C)
正如在另一个答案中所建议的那样,您可以使用JNI与低级语言(如C)交互以完成您想要的任务,但是您必须将并发性(在该低级语言中管理的线程)委托给它…假设2241是java进程的pid。运行:
jstack 2241
这将为您提供一个线程列表。在那里找到您的,并注意nid字段。假设nid=0x8e9,它将以10为基数转换为2281。然后运行:
taskset -p -c 0 2281
完成。您可以使用JNA在纯Java中完成。不需要使用任务集。请记住,线程关联是没有意义的,除非您之前已将内核与内核/用户线程和硬件中断隔离开来。我隶属于Coral Blocks公司,该公司开发的Coral Blocks正是这样做的。是的,否则java不会独立于硬件吗