如何强制两个Java线程在同一处理器/核心上运行?

时间:2010-02-12 23:35:41

标签: java multithreading

我想要一个不包含关键部分或类似同步替代方案的解决方案。我正在寻找类似于Windows的光纤(用户级线程)的东西。

4 个答案:

答案 0 :(得分:14)

操作系统管理在哪个核心上处理哪些线程。您需要将线程分配给操作系统中的单个核心。

例如。在Windows上,打开任务管理器,转到进程选项卡,然后右键单击java进程...然后将它们分配给特定的核心。

这是你最好的。

答案 1 :(得分:3)

据我所知,你无法做到这一点 仅仅因为操作系统管理正在运行的线程并根据它的调度程序分配资源。

修改
由于你的目标是有一个“备用”核心来运行其他进程,我建议你使用一个线程管理器并获得系统上的核心数量(x),然后在特定系统上产生大多数x-1个线程。这样你就可以获得备用核心。

以前的语句仍然适用,除非您在操作系统中指定,否则无法指定运行线程的核心。但是从java,没有。

答案 2 :(得分:2)

如果没有将整个JVM分配给单个核心,我不确定你是如何做到这一点的。在Linux中,您可以使用taskset:

http://www.cyberciti.biz/tips/setting-processor-affinity-certain-task-or-process.html

我想你可以在虚拟化环境(例如,VirtualBox / VMWare实例)中运行你的JVM并分配一个处理器,但我不确定那能得到你想要的东西。

答案 3 :(得分:0)

我读这是因为询问Java应用程序是否可以控制线程亲和性本身。 Java没有提供任何方法来控制它。它被视为主机操作系统的业务。

如果有什么可以做到的话,操作系统可以,而且他们通常可以,尽管您用于线程固定的工具将是特定于操作系统的。 (但如果操作系统本身是虚拟化的,那么有两个级别的固定。我不知道这是否会起作用/实用。)


现代JVM中似乎没有任何相关的Hotspot JVM线程调整选项。

如果您使用的是Rockit JVM,您可以在“本机线程”(Java和OS线程之间存在1-1映射)和“瘦线程”之间进行选择,其中多个Java线程被复用到少量操作系统上线程。但是AFAIK,JRocket“瘦线程”仅支持32位模式,并且它们不允许您调整所使用的OS线程数。

根据Sun支持合同,您应该提出这个问题。他们有多年来一直在想办法如何从大型Java应用程序中获得最佳性能。