3

我只是通过尝试创建一些小程序来学习多线程,我发现了一件具体的事情,我不确定为什么会这样。

我有两个班,他们都数到 20 亿,最后他们打印出他们做这件事的时间。它们位于单独的文件中。第一个可以在大约 2 秒内完成(它会更快,但我也在那里做其他事情),以及新的 Thread(new 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 行,我没有意识到变量计数是双倍的,而在第 10 行,在for循环中我使用了int。递增变量的速度与线程无关,这是原始数据类型的问题,如下面的评论中所述。

4

2 回答 2

5

这与线程无关。仔细查看您的代码(顺便说一句,这很乱),第一个示例使用int i作为循环索引,第二个示例使用双 i作为循环索引。Double 是一种不同的数据类型,通常比 int 慢得多。

于 2013-05-24T18:21:08.920 回答
0

一种可能性是,在您的第二个示例中,您的计数器是双精度而不是整数。根据架构和特定操作,整数和双精度数具有不同的性能。增加值可能是一种特殊情况,但在您的机器上,增加双精度数可能比增加整数慢。尝试替换double iint i看看它的表现如何。

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

于 2013-05-24T18:21:22.043 回答