2013-01-22 19:48:10.0|分类: struts源码分析|浏览量: 1530
|
抓取数据只靠一个单独的线程来工作,速度很慢,如果多开起几个线程速度是不是是原来的几倍呢?这个不用回答了。
1、创建线程可以继承Thread类和实现接口Runnable,2种方式。 2、现在就看看具体怎么在项目中运用到的。首先看看线程类ManyThread 的实现: package com.xing.thread;
import com.xing.action.crawl.SpecialtyAction;
public class ManyThread extends Thread {
@Override
public void run() {
while(TestThread.urlList.size()>0){
try {
String url = TestThread.getOneUrl();
System.out.println("Thread " + Thread.currentThread().getName() + " prints :" +url);
SpecialtyAction specialtyAction = new SpecialtyAction();
SpecialtyAction.init();
String baseUrl ="http://gkcx.eol.cn/";
specialtyAction.collegeSpecialty(url, baseUrl);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
注释:(1)通过继承Thread创建线程。 (2)重写线程类的run()方法,这里主要是你的业务逻辑。 (3)TestThread.getOneUrl()获得要抓取的url地址,这里采用了synchronized关键字,因为多个线程同时获取url,可能线程不同步问题。 (4)后面都是具体抓取业务的逻辑代码。
3、测试类TestThread的实现: package com.xing.thread;
import java.util.ArrayList;
import java.util.List;
public class TestThread {
public static List<String> urlList = new ArrayList<String>();
public static void init(List<String> listUrl) {
if(listUrl==null){
return ;
}
for (int i = 0; i < listUrl.size(); i++) {
urlList.add(listUrl.get(i));
}
}
synchronized public static String getOneUrl() {
if (urlList.size() > 0)
return (String) urlList.remove(0);
else
return null;
}
/**
* @param args
*/
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for(int i=550 ;i<650;i++){
list.add("http://gkcx.eol.cn/schoolhtm/schoolSpecailtyMark/"+i+"/schoolSpecailtyMark.htm");
}
init(list);
for (int i = 0; i < 10 ; i++) {
Thread t = new ManyThread();
t.start();
}
System.out.println("----------------------------------------------------");
}
}
注释:(1)定义了静态变量urlList ,用来保存将要抓取的url。 (2)init()方法主要是向urlList 中添加url。 (3)getOneUrl()方法获取urlList 第一个url对象,并且在urlList 中移除这个对象,是为了下次能获取到新的url。 (4)main()方法测试逻辑代码,new ArrayList<String>()对象,并且向其中添加url地址,调用init()初始化urlList中的数据,开启十个线程,并且启动每个线程。
Ok!到这里多线程就搞完了,可以测试一下。 |
