我正在制作一个简单的程序来从多个网页中删除内容。我想提高程序的速度,所以我想使用线程。我希望能够控制一些整数的线程数量(我想让用户能够定义这一点)。
这是我想为以下代码创建线程的代码:
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;
}
}
}
我已经阅读了几天关于线程的内容,我无法弄清楚如何在我的情况下实现线程化?有人可以提供一些见解吗?
答案 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)