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

您可以使用ThreadGroup来控制要维护的线程。或者你也可以实现ThreadPool控制线程的机制。

您可以在此处帮助使用线程组类。

并在此处ThreadPool执行示例。

希望这会帮助你。

享受 !!!

于 2012-05-09T17:47:58.280 回答
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();

显然,你仍然需要添加代码来控制你想要创建多少个 Threads 等,并决定如果达到你的阈值你想要做什么。

于 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(); 创建和启动新线程

只有您可能想要跟踪线程以加入它,因此您一次不会有太多线程。当您遇到该问题时,请考虑使用 ThreadPool 直接提交 Runnables。

最后一件事,爬行时,做一个好公民!尊重建议,使用 robots.txt 文件,不要在同一服务器上打开多个线程,等等......

玩得开心!

于 2012-05-09T17:47:12.320 回答