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,如需转载请自行联系原作者



相关文章
|
14天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
16天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
16天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
17天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
101 2
|
17天前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
47 1
|
1月前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
5月前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
146 1
|
8月前
|
设计模式 监控 Java
Java多线程基础-11:工厂模式及代码案例之线程池(一)
本文介绍了Java并发框架中的线程池工具,特别是`java.util.concurrent`包中的`Executors`和`ThreadPoolExecutor`类。线程池通过预先创建并管理一组线程,可以提高多线程任务的效率和响应速度,减少线程创建和销毁的开销。
252 2
|
8月前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
79 1
|
5月前
|
安全 算法 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(下)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
90 6
下一篇
开通oss服务