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

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

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

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

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

转载请用链接注明: 来源博客http://blog.csdn.net/yjflinchong

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


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

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

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

源代码如下:

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

}

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


7楼qq54592366421分钟前
群猪 老夫来也
6楼wsmwqp昨天 08:57
顶起来
5楼yjflinchong昨天 17:03
好文章,支持下
4楼yjflinchong昨天 14:09
请支持原创。 转载请注明链接。
3楼EvilGreenArmy昨天 14:07
疯子哥 文笔犀利,言简意赅,实来脍炙人口的 千古佳作啊!
Re: yjflinchong昨天 14:08
回复EvilGreenArmyn我草。。。 你太猛了吧
2楼aspire_1昨天 14:05
回去好好学习下
1楼yjflinchong昨天 14:01
好文章,得顶。