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

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

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

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

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

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

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

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

源代码如下:

1、线程类

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.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Properties; import java.util.Timer;   public class Main {     private static boolean isRunGrabThread = true;     //抓取线程是否执行完毕    public static int threadCount = 3;   //线程数量    public static int daycount = 30;         //查询总天数   public static int thisdaycount = 0;    public static int isadsl = 0;  public static int adslcount = 1;               public static void main(String[] args) {            try {                               startThead();//启动抓取数据主线程            } catch (Exception e) {                 e.printStackTrace();            }       }                       public static void startThead(){            Thread[] grabThreads= new Thread[threadCount];             try{                        //开启-数据抓取子线程                for(int i=0;i<grabThreads.length;i++){                    Thread searchThread=new GetWebThread();                    grabThreads[i] = searchThread;                     grabThreads[i].setDaemon(true);                     grabThreads[i].start();                 }                               isRunGrabThread = true;                                //监控子线程,全部完成程序退出                WhileLoop:                                                                  while(true){                                        //拨号策略控制                    //reconnectControl();                                           //判断子线程是否运行完成                   for(int i=0;i<threadCount;i++){                       if(grabThreads[i].isAlive()){                           Thread.sleep(3*1000);                           continue WhileLoop;                         }                   }                   //所有抓取线程执行完毕                    isRunGrabThread = false;                                       //子线程执行完毕则退出                    break;              }           }           catch (Exception e) {               System.out.println("main主线程--系统异常!");             }       }                 }  

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

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

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

  1. Java多线程之线程同步机制(锁,线程池等等)

    Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...

  2. java多线程之线程同步问题

    1.线程不安全的问题分析 当多线程并发访问同一个资源对象的时候,可能出现线程不安全的问题.但是,我们分析打印的结果,发现没有问题: 为了让问题更明显:     Thread.sleep(10);//当 ...

  3. 3、Linux多线程,线程同步(转)

    3.Linux多线程,线程同步 5)线程私有数据 进程内的所有线程共享进程的数据空间,因此全局变量为所有线程所共有.但有时线程也需要保存自己的私有数据,这时可以创建线程私有数据(Thread-spec ...

  4. C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent

    C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent 本章概要: 1:终止状态和非终止状态 2:AutoResetEvent和ManualResetE ...

  5. VC++ MFC 多线程及线程同步(详细、全面总结!)

    更多详情:http://blog.csdn.net/whyacinth/ VC++ MFC 多线程及线程同步 关键词: MFC    多线程及线程同步                          ...

  6. Java多线程(线程同步)

    多线程编程很容易出现"错误情况",这是由系统的线程调度具有一定的随机性造成的,不过即使程序偶然出现问题,那也是由于编程不当引起.使用多个线程访问同一个数据时很容易出现此类状况,因此 ...

  7. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  8. Java多线程编程——线程同步与线程安全问题及synchronized关键字

    在多线程环境下,我们常常需要让多个线程同时去操作同一资源.在某些情况下,这种情形会导致程序的运行结果出现差错.专业上的,当多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不 ...

  9. java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决

    0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...

最新文章

  1. 【原创】Kakfa metrics包源代码分析
  2. 程序员委托事件学习随笔
  3. 机器学习如何选择模型 机器学习与数据挖掘区别 深度学习科普
  4. 学习笔记之-php编码技巧
  5. Scala模式匹配:类型匹配
  6. java调用第三方dll文件 源码_C++调用python文件(包含第三方库)
  7. 【CASS精品教程】CASS 9.2 for AutoCAD2014启动提示文件加载,怎么处理?
  8. python输入三行数据_3行Python代码就能获取海量数据?
  9. 动态创建php 类函数或函数
  10. 最新摸头GIF在线生成工具源码+实测可用
  11. 计算机的3d软件家庭版,3DOne家庭版 64位
  12. 山西台达plc可编程控制器_可编程控制器16(PLC)数据移位指令
  13. spring 解决循环依赖
  14. Userland中debian系统打开chromium
  15. 推荐系统学习之评测指标
  16. 快递到付被拒收怎么办?双方都拒收货物会怎么处理?
  17. 考研英语 刘晓艳小作文模板
  18. 洛谷 T284709 怨念(resent)
  19. Android手机输入法按键监听-dispatchKeyEvent
  20. 在phpstudy的环境下,如何配置php虚拟主机。

热门文章

  1. CDN和CDN加速原理
  2. PHP数组和Json之间的转换
  3. 高级定价基本概念理解
  4. sqlite管理工具
  5. linux下面的j2sdk的安装和配置过程
  6. Servlet的使用你掌握多少?
  7. php 5.4.5,PHP 5.4.5 公布
  8. linux新建用户不显示,linux系统无法添加用户帐号的原因分析
  9. 时间字符串与时间戳批量转换
  10. 分享一年定级资深前端,与你分享他的完整学习过程