没有线程,hello world如何更快地工作

时间:2017-09-15 12:25:24

标签: java multithreading

我想对multythread函数进行性能测试,结果显示单线程函数的工作速度更快,这是我的代码。

  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但是在没有线程的函数中,我在10秒内等于400000,那么为什么线程更慢,不应该更快?

不是:我的cpu有8个线程

3 个答案:

答案 0 :(得分:2)

创建Thread是一项代价高昂的操作。

在您的示例中,您创建了大量的线程,每个循环迭代一个。因此,您只需花费大量时间创建线程而不是实际工作。

如果您执行足够大的任务并将其分解为可以同时执行的较小任务,并使用合理数量的线程执行它们(例如,与您拥有的CPU /核心数相对应),则多线程可能会更快或者是它的一小部分)。

答案 1 :(得分:0)

您正在每个循环创建一个新线程,线程数超过您的CPU核心数。由于CPU试图对每个具有150000个线程的实例公平,这意味着每个线程只会在切换到新线程的后台之前执行一段时间。

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

答案 2 :(得分:0)

请求您在此处访问此来源:

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

这是在OpenJDK 6中实现Thread类的方式。你的程序在每个循环中都做了很多工作而没有产生任何可见的结果,并且在那之后实际上处于空闲状态。在尝试并行化一段代码时必须要小心,因为还要考虑创建Thread实例和调度程序的工作。此外,还有一种叫做阿马达尔定律的东西。如果并行化的成本高于使用它的成本节省,则不应该这样做。

如果您对使用多线程的性能增强感兴趣,我建议您快速阅读本文:

http://tutorials.jenkov.com/java-concurrency/amdahls-law.html