如果我编写一个多线程的Java应用程序,JVM是否会负责利用所有可用的内核?我必须做一些工作吗?
答案 0 :(得分:10)
除非您使用具有所谓“绿色”线程的JVM(目前这些线程非常少),否则Java线程由OS线程运行,因此默认情况下多个线程可以在不同的内核上运行。
答案 1 :(得分:4)
要跟进,我在双核上运行此代码时会看到两个内核的使用率达到100%。如果我将线程数从2增加到1,则一个核心变为100%,另一个核心变为4%。
package test;
import java.util.ArrayList;
public class ThreadTest
{
public void startCPUHungryThread()
{
Runnable runnable = new Runnable(){
public void run()
{
while(true)
{
}
}
};
Thread thread = new Thread(runnable);
thread.start();
}
public static void main(String[] args)
{
ThreadTest thread = new ThreadTest();
for (int i=0; i<2; i++)
{
thread.startCPUHungryThread();
}
}
}
答案 2 :(得分:2)
所有现代JVM都将利用与硬件一样多的内核。说明这一点的简单方法是在您的计算机上下载并运行DaCapo benchmark。 lusearch基准测试使用32个线程。如果您在桌面或服务器上运行它,您应该会看到所有CPU在测试期间达到100%的利用率。
答案 3 :(得分:0)
另一方面,尽管通过操作系统语义完成,但有时对Java进程的“绑定”/设置关联仅使用一组核心/套接字是有用的。如前所述,大多数运行时确实使用了所有cpu,而高度线程化的应用程序可能会占用比预期更多的资源。