一个线程比另一个线程慢,即使它们做同样的事情

时间:2013-05-24 18:09:29

标签: java multithreading

我只是通过尝试创建一些小程序来学习多线程,我发现了一个特定的东西,我不确定它为什么会这样。

我有两个课程,他们都数到20亿,最后他们打印出时间来完成它。它们位于不同的文件中。第一个可以在大约2秒内完成(它会更快,但我也在那里做其他的东西),和新线程(新的Runnable())

在主要类中

要慢得多,花了大约8秒才能完成它。你可以解释一下原因吗?这是代码。谢谢。

public class First implements Runnable {

private long startTime, endTime;
public static double count = 0;

@Override
public void run() {
    startTime = System.currentTimeMillis();

    for (int count = 0; count <= 2000000000L; count++);

    endTime = System.currentTimeMillis();
    System.out.println(endTime - startTime); //it is done in about 2seconds
  }
 }


public class Threads {

   public static void main(String[] args){

         First f = new First();
         f.run();

     new Thread(new Runnable() {

        @Override
        public void run() {

            long startTime, endTime;
            double count;
            startTime = System.currentTimeMillis();

            for (count = 0; count < 2000000000L; count++)l

            endTime = System.currentTimeMillis();
            System.out.println(endTime - startTime); //about 8 seconds

        }
    }).start();
 }
}

更新

问题出在第4行,我没有意识到变量 count 是双倍的,而在第10行,在 for 循环中我使用了 int 。增加变量的速度与线程无关,这是原始数据类型的问题,如下面的评论中所述。

2 个答案:

答案 0 :(得分:5)

没有与线程有关。仔细看看你的代码(顺便说一下,它是 mess ),第一个例子使用 int i 作为循环索引,第二个使用 double i 作为循环索引。 Double是一种不同的数据类型,通常比int慢得多。

答案 1 :(得分:0)

一种可能性是,在您的第二个示例中,您的计数器是双精度而不是整数。根据体系结构和特定操作,整数和双精度具有不同的性能。增加值可能是一种特殊情况,但是在您的机器上,递增双精度可能比递增整数慢。尝试将double i替换为int i并查看其效果。

来源:https://stackoverflow.com/a/2550851/2076603