您的位置:首页 > 编程语言 > Java开发

java多线程采集+线程同步

2016-05-19 14:40 330 查看
做大数据项目必须用到多线程,从网上找了个例子,很好,故记录下来以备参考

源代码如下:

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

}
第二步,启动线程,准备线程数量

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主线程--系统异常!");
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息