Hello World的工作方式更快而无需线程



我想在多线程功能上进行性能测试,结果表明,单线函数的工作速度更快,这是我的代码。

  package jollyDay;
public class JollyDay implements Runnable
{   
     public void run() {
            System.out.println("Hello from a thread!");
        }
        public static void main(String args[]) 
        {
            int i=0;
            while(true)
            //  {new JollyDay().run();i++;System.out.println(i);}
            {(new Thread(new JollyDay())).start();i++;System.out.println(i);}
        }
}

在螺纹函数中,i等于150000,但在没有线程的功能中,i等于400000在10秒内,为什么螺纹较慢,不应该更快?

不是:我的CPU有8个线程

创建Thread是一个昂贵的操作。

在您的示例中,您会创建大量的线程,每个线程遍历一个迭代。因此,您花费大量时间仅创建线程而不是进行实际工作。

如果您执行足够大的任务并将其分解为可以同时执行的较小任务,并用合理数量的线程执行它们(例如,与您拥有的CPU/CPU的数量相对应或它的一小倍数)。

您在每个循环中创建一个新线程,线程数超过CPU内核的数量。由于CPU试图对每个实例说150000线程都表示公平,这意味着每个线程仅在切换到新线程的背景之前执行一段时间。

尝试创建2个线程或8个线程,这将产生更好的结果。

请求您在此处转到此源:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/jdk/openjdk/6-b14/java/java/lang/lang/lang/thread.java

这是在OpenJDK 6中实现线程类的方式。您的程序在每个循环中都有很多工作,而无需产生任何可见的结果,然后实际上是闲置的。在尝试并行化一件代码时,必须要小心,因为还需要考虑线程实例和调度程序努力的创建。另外,还有一种叫做Amadahl的律法。如果并行化的成本远远超过使用它的成本,则不应该这样做。

如果您对使用多线程的性能提高感兴趣,我建议在此处快速阅读本文:

http://tutorials.jenkov.com/java-concurrency/amdahlslaw.html

最新更新