java多线程数据采集_java多线程采集+线程同步

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

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

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

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

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

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

源代码如下:

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

String[] way = txt[t].split("\\|");

String start = way[0];

String end = way[1];

//抓取到的数据列表

List 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();

}

}

}

第二步, 准备线程启动。

控制线程数量。

查询数据总天数。

设置拨号状态等。

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

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

if(grabThreads[i].isAlive()){

Thread.sleep(3*1000);

continue WhileLoop;

}

}

//所有抓取线程执行完毕

isRunGrabThread = false;

//子线程执行完毕则退出

break;

}

}

catch (Exception e) {

System.out.println("main主线程--系统异常!");

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值