java破解ip屏蔽+多线程同步

来源:互联网 发布:业余开淘宝店能赚钱吗 编辑:程序博客网 时间:2024/06/06 01:47

java破解ip屏蔽+多线程同步


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

上面几回,讲到了。 单线程 破解ip屏蔽。 比较容易。 只要拨号就行了。
 
多线程抓取数据也比较容易, 但是引入多线程之后。 拨号就容易出现问题。
 

多线程抓取的时候,这个拨号就比较麻烦一点。 因为,多线程拨号,
 
会出现: 第一个线程拨号的时候,第二个线程也同时进入拨号,第三个  4个  同样会进入。 这样会导致线程一直在拨号。 导致无限循环。
 

 


 

 

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


本人是新手, 采用了比较简单的方法。
 
  就是,第一个开始拨号, 就告诉后面的,我已经在拨号了。
 
你们反正抓取不了数据,那就先等一等,等我第一个拨号完毕,大家所有线程在进行下一轮的循环抓取数据。
 
多线程数据采集系列
 

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

源码如下:
 
1、线程类
 
其中:
 


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

 

 


[java] view plaincopy
01.package com.yjf.util; 
02.import java.util.Date; 
03.import java.util.List; 
04. 
05. 
06.public class GetWebThread extends Thread{ 
07.     
08.    /**
09.     * 线程
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.} 
 

 


2、拨号监听线程
 

 

 


[java] view plaincopy
01.package com.yjf.util; 
02. 
03.import java.util.Date; 
04.import java.util.TimerTask; 
05. 
06.public class AdslThead extends TimerTask{ 
07.     
08.    public static boolean isadsl = false; 
09. 
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
01.Timer adsl=new Timer(); 
02.adsl.schedule(new AdslThead(),1000,1000*5);//启动拨号检测线程 

 

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

 

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

 

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

 

原创粉丝点击