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

来源:互联网 发布:什么影视cms好 编辑:程序博客网 时间:2024/05/29 02:17

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

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

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

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

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

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


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

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

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

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

http://www.jfong.cn/solution-119.html

转载文章,请注明出处。http://blog.csdn.net/yjflinchong

源码如下:

1、线程类

其中:

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

[java] view plaincopy
  1. package com.yjf.util;  
  2. import java.util.Date;  
  3. import java.util.List;  
  4.   
  5.   
  6. public class GetWebThread extends Thread{  
  7.       
  8.     /** 
  9.      * 线程 
  10.      */  
  11.     public void run(){  
  12.         try {  
  13.             while (true) {  
  14.                 int day = 0;  
  15.                 long time1 = new Date().getTime();  
  16.                 //用来同步抓取线程  
  17.                 synchronized("searchthead"){  
  18.                     Main.thisdaycount++;  
  19.                     if(Main.thisdaycount>Main.daycount){  
  20.                         break;  
  21.                     }  
  22.                     System.out.println("开始查询第"+(Main.thisdaycount)+"天");  
  23.                     Thread.sleep(133);  
  24.                     day = Main.thisdaycount-1;  
  25.                 }  
  26.                 //获取抓取的时间  
  27.                 String datetext = TimeUtil.date.format(TimeUtil.addDaysForDate(day));  
  28.                 String[] txt =FileUtil.getCityByTxtFile();  
  29.                 for(int t=0;t<txt.length;t++){  
  30.   
  31.                     String[] way = txt[t].split("\\|");  
  32.                     String start = way[0];  
  33.                     String end = way[1];  
  34.                     //抓取到的数据列表  
  35.                     List<DataBean> datalist = Main.getDataList(datetext, start, end);  
  36.                     if(datalist!=null){  
  37.                         Main.isadsl = 0;  
  38.                         CheckAdsl.adsllasttime = new Date().getTime();  
  39.                         FileUtil.addDataToFileCsv(datalist);  
  40.                         Main.log.printLog("===="+datetext+"="+start+"="+end+"="+t+"=数据总数:"+datalist.size());  
  41.                     }else{  
  42.                             Thread.sleep(11);  
  43.                             AdslThead.isadsl = true;  
  44.                             Thread.sleep(11);  
  45.                             //判断是否正在拨号 并暂停线程  
  46.                             while (AdslThead.isadsl) {  
  47.                                 Thread.sleep(5000);  
  48.                             }  
  49.                         t--;  
  50.                     }  
  51.                 }  
  52.                 long time2 = new Date().getTime();  
  53.                 Main.log.printLog(datetext+"==查询完毕=========耗时"+(time2-time1));  
  54.             }  
  55.         } catch (Exception e) {  
  56.             Main.log.printLog(e.getMessage());  
  57.             e.printStackTrace();  
  58.         }  
  59.     }  
  60.       
  61. }  

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

2、拨号监听线程


[java] view plaincopy
  1. package com.yjf.util;  
  2.   
  3. import java.util.Date;  
  4. import java.util.TimerTask;  
  5.   
  6. public class AdslThead extends TimerTask{  
  7.       
  8.     public static boolean isadsl = false;  
  9.   
  10.     @Override  
  11.     public void run() {  
  12.         try {  
  13.             if(isadsl){  
  14.                 System.out.println("-------拨号线程线程启动-----");  
  15.                 ConnectAdslNet.reconnectAdsl("宽带",Main.adslname,Main.adslpass);  
  16.                 isadsl = false;  
  17.             }  
  18.         } catch (Exception e) {  
  19.             System.out.println(e.getMessage());  
  20.         }  
  21.     }  
  22. }  

3、启动拨号监听程序。  每隔一段时间,循环一次。 这样稳定性,准确性更高。

[java] view plaincopy
  1. Timer adsl=new Timer();  
  2. adsl.schedule(new AdslThead(),1000,1000*5);//启动拨号检测线程  

通过这3步, 就可以较好的控制 多线程抓取过程中的 。 拨号问题了。


效率和稳定性就比较好了。  本人,在开启程序7-30天 , 都能稳定运行。


超过30天,程序运行怎么样。 就只有天知道咯 。 哈哈

原创粉丝点击