5

「test.com」に 0 から 100 までのリクエストを送信したいのですが、コードは 1 秒ごとにリクエストを送信します。このようにすると、プログラムが完了するまでに 100 秒かかります。

私がやりたいことは、10 個のスレッドを同時に実行するように設定し、スレッド 1 を (0,10) から開始することです。(10,20) からのスレッド 2 ... など、このようにして、プログラムは完了するまでに 10 秒程度しかかからないはずですが、それは可能ですか? どうすれば達成できますか?

import java.io.InputStreamReader;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;

public class Palomo implements Runnable {
    String url = "http://test.com";
    HttpClient client = null;
    PostMethod method = null;
    BufferedReader br = null;
    String contents = null;

    public void run() {
        for (int i = 0; i <= 100; i++) {
            synchronized (this) {
                doPost(i);
            }
                      try {
        Thread.sleep(1000);
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
        }
    }

    public void doPost(int i) {
        try {
            client = new HttpClient();
            method = new PostMethod(url);

            this.method.addParameter("myPostRequest", Integer.toString(i));

            client.executeMethod(method);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            method.releaseConnection();
        }
    }

    public static void main(String[] args) {
        new Thread(new Palomo()).start();
    }
}

どうもありがとう !

編集

あなたが私に与えた指示を読んで、私はこの恐ろしいモンスターを作成しました...

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SimpExec {
    public static void main(String args[]) {

        ExecutorService es = Executors.newFixedThreadPool(4);

        es.execute(new MyThread("A"));
        es.execute(new MyThread("B"));
        es.execute(new MyThread("C"));
        es.execute(new MyThread("D"));

        es.shutdown();
    }
}

class MyThread implements Runnable {
    String name;

    MyThread(String n) {
        name = n;
        new Thread(this);
    }

    public void run() {
        if (name=="A"){
            for (int i=1;i<=10;i++){
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        if (name=="B"){
            for (int i=10;i<=20;i++){
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        if (name=="C"){
            for (int i=20;i<=30;i++){
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        if (name=="D"){
            for (int i=30;i<=40;i++){
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

これはおそらくあなたがこれまでに見た中で最もひどいコードであることはわかっていますが、私が望むものを正確に作成しています.これを正しい方法で達成する方法についていくつかの指示を与えることができれば、それは素晴らしいことです.

素晴らしいアドバイスをありがとうございました

4

5 に答える 5

5

この種のことを実現するために作成されたExecutorServiceを確認する必要があります。

を使用して 10 個のスレッドのプールを作成しExecutors.newFixedThreadPool(10);、実行するタスク ( ) を送信Runnableできます。プールは、スレッド間のタスクのディスパッチを処理します。

于 2012-10-11T08:19:10.300 に答える
4

Executors.newFixedThreadPool(10)で Executorを作成し、それを使用して各リクエストを独自の Runnable として実行できます。

于 2012-10-11T08:19:27.853 に答える
0

他のコメントを追加するには、ExecutorService(これは優れたソリューションです)を使用することを提案し
、送信されたRunnableオブジェクトのそれぞれに処理する要求の範囲が必要です。
。Runnableを拡張するクラスを検討する必要があります。
そのためのコードは次のように見える可能性があります-

public class RangedPosts extends Runnable {
    private int start;
    private int end;
    public RangedPosts(int start,int end) {
        this.start = start;
        this.end = end;
    }

    public void run() {
       //Perform here a loop from start to end
    }
}

そして、使用法はforループであり、RangePostsの実行可能なオブジェクトを10個作成し、それらに範囲定義(開始と終了)を渡します。

于 2012-10-11T08:45:43.863 に答える
0

PostRequest 間の時間を最小限に抑えてみませんか。スレッドを使用すると、送信間の時間が短くなるため、同じ影響があります。これでスレッドを使用して、投稿が送信される順序を変更することで達成できる唯一のこと

1, 11, 21,31,41 ... 2, 12,22,32,...

使用する

Thread.CurrentThread.Sleep(100)

メイン アプリケーションでの送信間隔を短縮します。

また、複数のスレッドが同じ HTTPClient にアクセスできるようにすることで、問題が発生する可能性があります。アクセスを同期したとしても、httpclient は一度に 1 つのリクエストしか投稿できないため、送信プロセスはシリアルになります。

于 2012-10-11T08:21:14.580 に答える