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

 java破解ip屏蔽+多线程同步-【多线程数据采集之五】。   到今天为止,算是讲完了一部分了。  

多线程数据采集系列   整个过程就是:  抓取,分析,破解屏蔽,多线程, 多线程数据同步以及拨号同步。

上面几回,讲到了。 单线程 破解ip屏蔽。 比较容易。 只要拨号就行了。

多线程抓取数据也比较容易, 但是引入多线程之后。 拨号就容易出现问题。

多线程抓取的时候,这个拨号就比较麻烦一点。 因为,多线程拨号,

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


怎么控制这个拨号同步,达到较高的效率呢。  

本人是新手, 采用了比较简单的方法。

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

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

七七八八网http://www.qi788.com

转载文章,请注明出处。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(); 		} 	} 	 }

尖锋网http://www.jfong.cn

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天,程序运行怎么样。 就只有天知道咯 。 哈哈






      本文转自yjflinchong 51CTO博客,原文链接:http://blog.51cto.com/yjflinchong/1164936,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值