更改线程的目标核心

时间:2012-09-28 13:57:57

标签: java multithreading cpu-usage cpu-cores

告诉线程以编程方式更改正在运行的核心的方法是什么?

让我们说我正在使用FX-8150,它有一些内核,但我希望我的一个线程能够在5.core中工作。这可能吗?如果是的话,你能给出一个Java样本吗?该线程可能是另一个进程'线程或当前进程'线程。

我的伪示例:

time interval 1 : my_thread working in first core at 5GHz while other cores are 3.6 GHz
time interval 2 : my_thread working in second core at 5GHz while other cores are 3.6 GHz
time interval 3 : my_thread working in third core at 5GHz while other cores are 3.6 GHz
time interval 4 : my_thread working in fourth core at 5GHz while other cores are 3.6 GHz
time interval 5 : my_thread working in fifth core at 5GHz while other cores are 3.6 GHz
time interval 6 : my_thread working in sixth core at 5GHz while other cores are 3.6 GHz
time interval 7 : my_thread working in seventh core at 5GHz while other cores are 3.6 GHz
time interval 8 : my_thread working in eighth core at 5GHz while other cores are 3.6 GHz

所有其他核心都需要闲置。

2 个答案:

答案 0 :(得分:3)

我有一个名为Java Thread Affinity的库,它允许您将运行的线程分配给逻辑线程或核心。

在您的情况下,您需要至少为操作系统允许一个核心,并且您可以保留Linux中的所有剩余核心。线程库将线程分配给这些保留的内核。你想要保留cpus的原因是为了防止在那个cpu上运行其他线程。您可以告诉库将线程分配给逻辑cpu或整个核心。您可以将线程分配给与另一个线程相同或不同的核心或套接字。

https://github.com/peter-lawrey/Java-Thread-Affinity/wiki/Getting-started

该库目前支持Windows和Linux。

答案 1 :(得分:1)

假设您使用的是Windows 7.在任务管理器中找到该过程,右键单击它,选择设置关联,选择您希望它使用的核心。

http://www.sevenforums.com/tutorials/83632-processor-affinity-set-applications.html

<强>编程方式:

您可以通过在与程序相同的文件夹中创建.bat批处理文件来永久设置程序的亲和力,其内容为:

start /affinity 1 program_name.exe

start /affinity 1 <invoke your_java_program>

这会强制程序只使用cpu core 0.使用... / affinity 2 ...来指定cpu core 1等

然后,您应该修改程序的开始菜单和/或桌面快捷方式,以指向新创建的批处理文件。

一个小缺点是,在程序打开之前,您会看到一个小的cmd窗口在屏幕上短暂闪烁。

为了获得额外的性能,您可以添加/ high以使应用程序具有更高的CPU优先级。

start /affinity 1 /high program_name.exe
start /affinity 1 <invoke your_java_program>