0

私はいくつかのウェブページからコンテンツをこすり取る簡単なプログラムを作っています。プログラムの速度を上げたいので、スレッドを使いたいです。整数でスレッドの量を制御できるようにしたい(ユーザーがこれを定義できるようにしたい)。

これは私がスレッドを作成したいコードです:

public void runLocales(String langLocale){
    ParseXML parser = new ParseXML(langLocale);
    int statusCode = parser.getSitemapStatus();
    if (statusCode > 0){
        for (String page : parser.getUrls()){
            urlList.append(page+"\n");
        }
    }else {
        urlList.append("Connection timed out");
    }
}

そして、parseXMLクラス:

public class ParseXML {
private String sitemapPath;
private String sitemapName = "sitemap.xml";
private String sitemapDomain = "somesite";
Connection.Response response = null;
boolean success = false;

ParseXML(String langLocale){
    sitemapPath = sitemapDomain+"/"+langLocale+"/"+sitemapName;
    int i = 0;
    int retries = 3;

    while (i < retries){
        try {
            response = Jsoup.connect(sitemapPath)
                    .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")
                    .timeout(10000)
                    .execute();
            success = true;
            break;
        } catch (IOException e) {

        }
        i++;
    }
}

public int getSitemapStatus(){
    if(success){
        int statusCode = response.statusCode();
        return statusCode;
    }else {
        return 0;
    }
}

public ArrayList<String> getUrls(){
    ArrayList<String> urls = new ArrayList<String>();
    try {
        Document doc = response.parse();

        Elements element = doc.select("loc");
        for (Element page : element){
            urls.add(page.text());
        }           
        return urls;
    } catch (IOException e) {
        System.out.println(e);
        return null;
    }
}   
}

私は数日間スレッドについて読んでいますが、私の場合、スレッドを実装する方法がわかりませんか?誰かが洞察を提供できますか?

4

4 に答える 4

1

このようなことをする必要があります:

new Thread(
        new Runnable() {
            public void run() {
                try {
                   runLocales(langLocale);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println(
                    "child thread  " + new Date(System.currentTimeMillis()));
            }
        }).start();

もちろん、作成するスレッドの数などを制御するコードを追加し、しきい値に達した場合に何をするかを決定する必要があります。

于 2012-05-09T17:46:01.963 に答える
1

私が明白に答えていて、あなたの問題が異なっているならすみませんが、あなたが望むものは定義することであるように見えます

public class Runner extends Runnable{

    private final String langLocale;

    public Runner(String langLocale){
        this.langLocale = langeLocale;
    }

    public void run(){ //Instead of public void runLocales(String langLocale)
        //Do your thing here
    }
 }

次に、new Thread(new Runner( "smth"))。start();を使用して新しいスレッドを作成して開始します。

おそらくあなただけがスレッドを追跡してそれに参加したいので、一度にあまり多くのスレッドを持っていることはありません。そして、その問題が発生した場合は、Runnablesを直接渡す場所でThreadPoolを使用することを検討してください。

そして最後に、這うときは良い市民になりましょう!推奨事項を尊重し、robots.txtファイルを使用し、同じサーバーに対して2つ以上のスレッドを開かないでください...

楽しむ!

于 2012-05-09T17:47:12.320 に答える
1

を使用して、ThreadGroup保守するスレッドを制御できます。ThreadPoolまたは、スレッドを制御するためのメカニズムを実装することもできます。

ここでスレッドグループクラスの使用を支援できます。

そして、ここThreadPoolでの実装サンプルについては。

これがお役に立てば幸いです。

楽しみ !!!

于 2012-05-09T17:47:58.280 に答える