そのため、URL に大量 (10,000 件以上) の GET 要求を送信する必要があるプログラムを作成しましたが、できるだけ高速にする必要があります。最初にプログラムを作成したとき、接続を for ループに入れただけでしたが、続行する前に各接続が完了するのを待たなければならないため、非常に遅くなりました。もっと速くしたかったので、スレッドを使ってみたところ、多少速くなりましたが、まだ満足していません。
これを行う正しい方法は、非同期接続を使用してすべての URL に接続することだと思います。これは正しいアプローチですか?
また、スレッドとその仕組みを理解しようとしていますが、理解できないようです。私が使用しているコンピューターには、Intel Core i7-3610QM クアッドコア プロセッサが搭載されています。このプロセッサの仕様に関する Intel の Web サイトによると、8 つのスレッドがあります。これは、Java アプリケーションで 8 つのスレッドを作成でき、それらはすべて同時に実行されるということですか? 8 を超えると速度が向上しませんか?
タスク マネージャーの [パフォーマンス] タブの [スレッド] の横にある数字は正確には何を表していますか? 現在、私のタスク マネージャーは、「スレッド」が 1,000 を超えていると表示しています。なぜこの数字なのか、プロセッサがサポートしているのが 8 を超えるのはなぜでしょうか? また、テストとして 500 スレッドでプログラムを試したところ、タスク マネージャーの数が 500 増加しましたが、代わりに 8 スレッドを使用するように設定した場合と同じ速度であることに気付きました。Java アプリケーションで使用しているスレッドの数に応じて数が増加している場合、速度が同じなのはなぜですか?
また、Java でスレッドを使用して小さなテストを試みましたが、出力が意味を成しません。ここに私のテストクラスがあります:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
private static int numThreads = 3;
private static int numLoops = 100000;
private static SimpleDateFormat dateFormat = new SimpleDateFormat("[hh:mm:ss] ");
public static void main(String[] args) throws Exception {
for (int i=1; i<=numThreads; i++) {
final int threadNum = i;
new Thread(new Runnable() {
public void run() {
System.out.println(dateFormat.format(new Date()) + "Start of thread: " + threadNum);
for (int i=0; i<numLoops; i++)
for (int j=0; j<numLoops; j++);
System.out.println(dateFormat.format(new Date()) + "End of thread: " + threadNum);
}
}).start();
Thread.sleep(2000);
}
}
}
これにより、次のような出力が生成されます。
[09:48:51] Start of thread: 1
[09:48:53] Start of thread: 2
[09:48:55] Start of thread: 3
[09:48:55] End of thread: 3
[09:48:56] End of thread: 1
[09:48:58] End of thread: 2
1 番目と 2 番目のスレッドがそれぞれ 5 秒かかるのに、3 番目のスレッドがすぐに開始および終了するのはなぜですか? 3 つ以上のスレッドを追加すると、2 つを超えるすべてのスレッドで同じことが起こります。
質問が多くて長文になってしまい申し訳ありません。前もって感謝します。