我只是通过尝试创建一些小程序来学习多线程,我发现了一个特定的东西,我不确定它为什么会这样。
我有两个课程,他们都数到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 。增加变量的速度与线程无关,这是原始数据类型的问题,如下面的评论中所述。
答案 0 :(得分:5)
没有与线程有关。仔细看看你的代码(顺便说一下,它是 mess ),第一个例子使用 int i 作为循环索引,第二个使用 double i 作为循环索引。 Double是一种不同的数据类型,通常比int慢得多。
答案 1 :(得分:0)
一种可能性是,在您的第二个示例中,您的计数器是双精度而不是整数。根据体系结构和特定操作,整数和双精度具有不同的性能。增加值可能是一种特殊情况,但是在您的机器上,递增双精度可能比递增整数慢。尝试将double i
替换为int i
并查看其效果。