私は、URLにGETリクエストをたくさん送信する必要があるプログラムを作成しました。これはできるだけ速くする必要があります。最初にプログラムを作成したとき、私は接続をforループに入れましたが、続行する前に各接続が完了するのを待たなければならないため、実際には遅かったです。私はそれを速くしたいので、スレッドを使ってみましたが、やや高速でしたが、まだ満足していません。スレッドを理解する+非同期
私はこのことについて、正しい方法を推測しています。これを実際に高速化するには、非同期接続を使用してすべてのURLに接続する必要があります。これは正しいアプローチですか?
また、私はスレッドを理解しようとしており、どのように動作するのですか、それを得ることはできません。私のコンピュータにはIntel Core i7-3610QMクアッドコアプロセッサが搭載されています。このプロセッサの仕様に関するインテルの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つ以上のスレッドを追加すると、2以上のすべてのスレッドで同じことが起こります。
申し訳ありませんが、これは長い読まれた場合、私はたくさんの質問をしました。 ありがとうございます。
お返事ありがとうございます。 編集中... – user1203585
ああ、実際にコメントを編集できません... 5分制限... "すべてのスレッドが共有するオブジェクトはありますか?このオブジェクトには同期メソッドがありますか? 私のすべてのスレッドは同じことをしています: URLオブジェクトをインスタンス化し、プロキシとの接続を開きます。 URLConnectionの接続タイムアウトと読み取りタイムアウトを設定します。その後、BufferedReaderとInputStreamReaderを使用してURLConnectionから読み取ります。最後に、テキストファイルに単語を書き込みます。 これは、各スレッドが実行しているスレッドのうち、500スレッドを実行しても速度が上がらないようです。/ – user1203585
Javaにはサイズが制限されている基盤接続プールがあると思われます。 http.maxConnections [http://docs.oracle.com/javase/1.4.2/docs/guide/net/properties.html]というネットワーキング・プロパティーがあります。デフォルトは5です。これは、5つ以上の接続が開いた後で、それらがすべて同じ5つの基本ソケット(共有リソース)を使用していることを意味します。再度、JVisualVMを使用してこれを確認できます。 – Pace