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

简介:

前些日子讲解了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,如需转载请自行联系原作者



相关文章
|
6天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
21 2
|
6天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
5天前
|
NoSQL 网络协议 Unix
1)Redis 属于单线程还是多线程?不同版本之间有什么区别?
1)Redis 属于单线程还是多线程?不同版本之间有什么区别?
16 1
|
6天前
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
6 0
|
6天前
|
Java
COMATE插件实现使用线程池高级并发模型简化多线程编程
本文介绍了COMATE插件的使用,该插件通过线程池实现高级并发模型,简化了多线程编程的过程,并提供了生成结果和代码参考。
Java里使用volatile进行线程同步的一个例子
Java里使用volatile进行线程同步的一个例子
101 0
Java里使用volatile进行线程同步的一个例子
Java线程同步的一些例子
Java线程同步的一些例子
118 0
Java线程同步的一些例子
一个使用AtomicInteger完成的Java线程同步的例子
一个使用AtomicInteger完成的Java线程同步的例子
105 0
一个使用AtomicInteger完成的Java线程同步的例子
|
10天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
下一篇
无影云桌面