いくつかの小さなプログラムを作成しようとしてマルチスレッドについて学んでいますが、なぜそれがそうなのかよくわからない特定のことを見つけました。
私は 2 つのクラスを持っています。どちらも 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 行目にあり、変数カウントが double であることに気付きませんでした。10 行目では、 forサイクルでintを使用しました。変数をインクリメントする速度はスレッドとは関係ありません。以下のコメントで述べたように、プリミティブ データ型の問題です。