多线程Java应用程序是否会很好地利用多核机器?

时间:2009-10-30 12:03:21

标签: performance multithreading jvm multicore

如果我编写一个多线程的Java应用程序,JVM是否会负责利用所有可用的内核?我必须做一些工作吗?

4 个答案:

答案 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,而高度线程化的应用程序可能会占用比预期更多的资源。