苏州网站建设品牌公司,聊城专业网站设计公司,无锡网站建设制作开发,上海知名的网站建设公司最近项目上有个需求#xff0c;需要从FTP服务器中下载大批量的数据文件#xff0c;然后解析该数据文件进行入库#xff0c;数据库为oracle#xff0c;最后在通过web工程#xff0c;以报表和图表的形式进行展现。这些批量的数据文件为纯文本文件#xff0c;每天产生数据文…最近项目上有个需求需要从FTP服务器中下载大批量的数据文件然后解析该数据文件进行入库数据库为oracle最后在通过web工程以报表和图表的形式进行展现。这些批量的数据文件为纯文本文件每天产生数据文件大概有1500个每个文件大概有500KB且随着时间的推移这些数据文件会逐渐增多。之前的实现方式是通过每天按时触发建立一个FTP连接使用这个连接读取文件读取一个下载一个。部署到生成环境后测试发现全部完成后需要7个小时如果文件随时间的增长显然是不能接受的。因此这里需要改成多线程来处理这样就可以缩短读取的时间这里做了个案例用来套用到修改的程序中案例代码如下实现代码package com.what21.thpool;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;public class ThreadPoolMain {/*** param args*/public static void main(String[] args) {//线程池维护线程的最少数量int corePoolSize 50;//线程池维护线程的最大数量int maximumPoolSize Integer.MAX_VALUE;//线程池维护线程所允许的空闲时间long keepAliveTime 4;//线程池维护线程所允许的空闲时间的单位TimeUnit unit TimeUnit.SECONDS;BlockingQueue taskQueue new ArrayBlockingQueue(10);// AbortPolicy 策略// 处理程序遭到拒绝将抛出运行时RejectedExecutionExceptionAbortPolicy handler new ThreadPoolExecutor.AbortPolicy();// 初始化线程池ThreadPoolExecutor threadPool new ThreadPoolExecutor(corePoolSize, maximumPoolSize,keepAliveTime, unit, taskQueue, handler);// 线程池执行for(int i0;i1000;i){final int count i;threadPool.execute(new Thread(new Runnable(){Overridepublic void run() {try {Thread.sleep(1*1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(count);}}));}}}执行流程描述1、线程池threadPool初始化时任务队列taskQueue中的线程为空线程池是不会马上执行的。2、当调用 线程池threadPool的execute()方法时添加一个线程线程池会做出如下的判断a、如果当前正在运行的线程数量小于corePoolSize就立即创建并执行这个线程b、如果当前正在运行的线程数量大于或等于corePoolSize新添加的线程会放入队列c、如果队列满了正在运行的线程数量小于 maximumPoolSize就继续创建线程运行这个任务d、如果队列满了正在运行的线程数量大于或等于 maximumPoolSize线程池threadPool会抛出不能接受新任务的异常。3、当一个线程完成任务时它会从队列taskQueue中取出一个任务来进行执行。4、当一个线程执行完毕时超过一定的时间keepAliveTime时线程池threadPool会判断如果当前池中运行的线程数大于corePoolSize那么这个线程就被停掉。线程池threadPool的所有任务完成后它最终会收缩到corePoolSize的大小。通过使用上述原理的多线程功能实现且每次都有50个线程并发执行测试后发现大大的降低了执行时间变成了2个多小时实践证明多线程就是好