java破解ip屏蔽+多线程同步-【多线程数据采集之五】。 到今天为止,算是讲完了一部分了。
多线程数据采集系列 整个过程就是: 抓取,分析,破解屏蔽,多线程, 多线程数据同步以及拨号同步。
上面几回,讲到了。 单线程 破解ip屏蔽。 比较容易。 只要拨号就行了。
多线程抓取数据也比较容易, 但是引入多线程之后。 拨号就容易出现问题。
多线程抓取的时候,这个拨号就比较麻烦一点。 因为,多线程拨号,
会出现: 第一个线程拨号的时候,第二个线程也同时进入拨号,第三个 4个 同样会进入。 这样会导致线程一直在拨号。 导致无限循环。
怎么控制这个拨号同步,达到较高的效率呢。
本人是新手, 采用了比较简单的方法。
就是,第一个开始拨号, 就告诉后面的,我已经在拨号了。
你们反正抓取不了数据,那就先等一等,等我第一个拨号完毕,大家所有线程在进行下一轮的循环抓取数据。
转载文章,请注明出处。http://blog.csdn.net/yjflinchong
源码如下:
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<txt.length;t++){ String[] way = txt[t].split("\\|"); String start = way[0]; String end = way[1]; //抓取到的数据列表 List<DataBean> 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);//启动拨号检测线程
通过这3步, 就可以较好的控制 多线程抓取过程中的 。 拨号问题了。
效率和稳定性就比较好了。 本人,在开启程序7-30天 , 都能稳定运行。
超过30天,程序运行怎么样。 就只有天知道咯 。 哈哈