java多线程采集+线程同步-【多线程数据采集之四】

时间:2022-05-04 07:41:28

前些日子讲解了java数据抓取, 今天就讲解最核心的。 java多线程数据抓取。 

java多线程采集+数据同步+线程同步【多线程数据采集之四】

主要讲解多线程抓取,多线程同步,多线程启动,控制等操作。 

文章栏目列表:http://blog.csdn.net/column/details/threadgrab.html


先讲解第一步,线程类。   核心数据抓取线程。

这个例子主要讲解的是  对设定的天数的数据抓取。 从当前日期往后推。

每个线程负责一天的数据任务抓取。

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

源代码如下:

1、线程类

[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.io.BufferedInputStream;  
  4. import java.io.FileInputStream;  
  5. import java.io.InputStream;  
  6. import java.util.ArrayList;  
  7. import java.util.Date;  
  8. import java.util.List;  
  9. import java.util.Properties;  
  10. import java.util.Timer;  
  11.   
  12.   
  13. public class Main {  
  14.     private static boolean isRunGrabThread = true;     //抓取线程是否执行完毕  
  15.     public static int threadCount = 3;   //线程数量  
  16.     public static int daycount = 30;         //查询总天数  
  17.     public static int thisdaycount = 0;  
  18.     public static int isadsl = 0;  
  19.     public static int adslcount = 1;  
  20.       
  21.       
  22.         public static void main(String[] args) {  
  23.             try {  
  24.                   
  25.                 startThead();//启动抓取数据主线程  
  26.             } catch (Exception e) {  
  27.                 e.printStackTrace();  
  28.             }  
  29.         }  
  30.           
  31.           
  32.         public static void startThead(){  
  33.             Thread[] grabThreads= new Thread[threadCount];    
  34.             try{            
  35.                 //开启-数据抓取子线程  
  36.                 for(int i=0;i<grabThreads.length;i++){  
  37.                     Thread searchThread=new GetWebThread();  
  38.                     grabThreads[i] = searchThread;  
  39.                     grabThreads[i].setDaemon(true);  
  40.                     grabThreads[i].start();  
  41.                 }  
  42.                   
  43.                 isRunGrabThread = true;  
  44.                   
  45.                 //监控子线程,全部完成程序退出  
  46.                 WhileLoop:                                
  47.                       
  48.                 while(true){  
  49.                       
  50.                     //拨号策略控制  
  51.                     //reconnectControl();     
  52.                       
  53.                     //判断子线程是否运行完成  
  54.                     for(int i=0;i<threadCount;i++){  
  55.                         if(grabThreads[i].isAlive()){  
  56.                             Thread.sleep(3*1000);  
  57.                             continue WhileLoop;  
  58.                         }  
  59.                     }  
  60.   
  61.                     //所有抓取线程执行完毕  
  62.                     isRunGrabThread = false;  
  63.                       
  64.                     //子线程执行完毕则退出  
  65.                     break;  
  66.                 }  
  67.             }  
  68.             catch (Exception e) {  
  69.                 System.out.println("main主线程--系统异常!");  
  70.             }  
  71.         }  
  72.           
  73.           
  74.   
  75. }  
【多线程数据采集之四】java多线程采集+数据同步+线程同步