单线程 破解ip屏蔽 比较容易 只要拨号就行了
多线程抓取数据也比较容易 但是引入多线程之后 拨号就容易出现问题
多线程抓取的时候这个拨号就比较麻烦一点 因为多线程拨号
会出现 第一个线程拨号的时候第二个线程也同时进入拨号第三个 个 同样会进入 这样会导致线程一直在拨号 导致无限循环
怎么控制这个拨号同步达到较高的效率呢
本人是新手 采用了比较简单的方法
就是第一个开始拨号 就告诉后面的我已经在拨号了
你们反正抓取不了数据那就先等一等等我第一个拨号完毕大家所有线程在进行下一轮的循环抓取数据
线程类
其中
AdslTheadisadsl = true; 就是用来设置告诉后面的线程已经有人在拨号了
package comyjfutil;
import javautilDate;
import javautilList;
public class GetWebThread extends Thread{
/**
* 线程
*/
public void run(){
try {
while (true) {
int day = ;
long time = new Date()getTime()
//用来同步抓取线程
synchronized(searchthead){
Mainthisdaycount++;
if(Mainthisdaycount>Maindaycount){
break;
}
Systemoutprintln(开始查询第+(Mainthisdaycount)+天)
Threadsleep()
day = Mainthisdaycount;
}
//获取抓取的时间
String datetext = TimeUtildateformat(TimeUtiladdDaysForDate(day))
String[] txt =FileUtilgetCityByTxtFile()
for(int t=;t<txtlength;t++){
String[] way = txt[t]split(\\|)
String start = way[];
String end = way[];
//抓取到的数据列表
List<DataBean> datalist = MaingetDataList(datetext start end)
if(datalist!=null){
Mainisadsl = ;
CheckAdsladsllasttime = new Date()getTime()
FileUtiladdDataToFileCsv(datalist)
MainlogprintLog(====+datetext+=+start+=+end+=+t+=数据总数+datalistsize())
}else{
Threadsleep()
AdslTheadisadsl = true;
Threadsleep()
//判断是否正在拨号 并暂停线程
while (AdslTheadisadsl) {
Threadsleep()
}
t;
}
}
long time = new Date()getTime()
MainlogprintLog(datetext+==查询完毕=========耗时+(timetime))
}
} catch (Exception e) {
MainlogprintLog(egetMessage())
eprintStackTrace()
}
}
}
拨号监听线程
package comyjfutil;
import javautilDate;
import javautilTimerTask;
public class AdslThead extends TimerTask{
public static boolean isadsl = false;
@Override
public void run() {
try {
if(isadsl){
Systemoutprintln(拨号线程线程启动)
ConnectAdslNetreconnectAdsl(宽带MainadslnameMainadslpass)
isadsl = false;
}
} catch (Exception e) {
Systemoutprintln(egetMessage())
}
}
}
启动拨号监听程序 每隔一段时间循环一次 这样稳定性准确性更高
Timer adsl=new Timer()
adslschedule(new AdslThead()*)//启动拨号检测线程