与线程混淆,初学者

时间:2012-05-09 17:37:32

标签: java multithreading

我正在制作一个简单的程序来从多个网页中删除内容。我想提高程序的速度,所以我想使用线程。我希望能够控制一些整数的线程数量(我想让用户能够定义这一点)。

这是我想为以下代码创建线程的代码:

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 个答案:

答案 0 :(得分:1)

答案 1 :(得分: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();

显然,您仍然需要添加代码来控制要创建的线程数等,并确定在达到阈值时要执行的操作。

答案 2 :(得分: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
    }
 }

然后使用创建和启动新线程      新线程(新的Runner(“smth”))。start();

只有您可能想要跟踪要加入它的线程,因此您一次没有太多线程。当你遇到这个问题时,可以考虑使用ThreadPool直接交给Runnables。

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

玩得开心!

答案 3 :(得分:1)

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

您可以帮助使用线程组类here

ThreadPool实施示例here

希望这会对你有所帮助。

享受!!!