java破解ip屏蔽+多线程同步拨号-[多线程数据采集之五]

2014-11-24 10:41:06 · 作者: · 浏览: 1

单线程 破解ip屏蔽。 比较容易。 只要拨号就行了。

多线程抓取数据也比较容易, 但是引入多线程之后。 拨号就容易出现问题。
多线程抓取的时候,这个拨号就比较麻烦一点。 因为,多线程拨号,

会出现: 第一个线程拨号的时候,第二个线程也同时进入拨号,第三个 4个 同样会进入。 这样会导致线程一直在拨号。 导致无限循环。

最近csdn 博客选举
从88名候选人中投票选出20名提名博主
请投我一票!


怎么控制这个拨号同步,达到较高的效率呢。
本人是新手, 采用了比较简单的方法。

就是,第一个开始拨号, 就告诉后面的,我已经在拨号了。

你们反正抓取不了数据,那就先等一等,等我第一个拨号完毕,大家所有线程在进行下一轮的循环抓取数据。

1、线程类

其中:

AdslThead.isadsl = true; 就是用来设置,告诉后面的线程,已经有人在拨号了。

package com.yjf.util;
import java.util.Date;
import java.util.List;


public class GetWebThread extends Thread{

/**
* 线程
*/
public void run(){
try {
while (true) {
int day = 0;
long time1 = new Date().getTime();
//用来同步抓取线程
synchronized("searchthead"){
Main.thisdaycount++;
if(Main.thisdaycount>Main.daycount){
break;
}
System.out.println("开始查询第"+(Main.thisdaycount)+"天");
Thread.sleep(133);
day = Main.thisdaycount-1;
}
//获取抓取的时间
String datetext = TimeUtil.date.format(TimeUtil.addDaysForDate(day));
String[] txt =FileUtil.getCityByTxtFile();
for(int t=0;t

String[] way = txt[t].split("\\|");
String start = way[0];
String end = way[1];
//抓取到的数据列表
List datalist = Main.getDataList(datetext, start, end);
if(datalist!=null){
Main.isadsl = 0;
CheckAdsl.adsllasttime = new Date().getTime();
FileUtil.addDataToFileCsv(datalist);
Main.log.printLog("===="+datetext+"="+start+"="+end+"="+t+"=数据总数:"+datalist.size());
}else{
Thread.sleep(11);
AdslThead.isadsl = true;
Thread.sleep(11);
//判断是否正在拨号 并暂停线程
while (AdslThead.isadsl) {
Thread.sleep(5000);
}
t--;
}
}
long time2 = new Date().getTime();
Main.log.printLog(datetext+"==查询完毕=========耗时"+(time2-time1));
}
} catch (Exception e) {
Main.log.printLog(e.getMessage());
e.printStackTrace();
}
}

}

2、拨号监听线程


package com.yjf.util;

import java.util.Date;
import java.util.TimerTask;

public class AdslThead extends TimerTask{

public static boolean isadsl = false;

@Override
public void run() {
try {
if(isadsl){
System.out.println("-------拨号线程线程启动-----");
ConnectAdslNet.reconnectAdsl("宽带",Main.adslname,Main.adslpass);
isadsl = false;
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
3、启动拨号监听程序。 每隔一段时间,循环一次。 这样稳定性,准确性更高。

Timer adsl=new Timer();
adsl.schedule(new AdslThead(),1000,1000*5);//启动拨号检测线程