java 多线程池_Java ThreadPoolExecutor线程池 同时执行50个线程

最近项目上有个需求,需要从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 策略

// 处理程序遭到拒绝将抛出运行时RejectedExecutionException

AbortPolicy handler = new ThreadPoolExecutor.AbortPolicy();

// 初始化线程池

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,

keepAliveTime, unit, taskQueue, handler);

// 线程池执行

for(int i=0;i<1000;i++){

final int count = i;

threadPool.execute(new Thread(new Runnable(){

@Override

public 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个多小时,实践证明多线程就是好!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java and dsl_Groovy语法糖以及DSL

前言Why初次接触到Groovy是在实习中接触到一个 纯Groovy写的项目&#xff0c;当时看了下这不就是没有分号的Java么&#xff0c;而且也是有年纪的语言了&#xff0c;并不想投入时间学习。后来工作中越来越多的看到Groovy的身影&#xff0c;Gradle&#xff0c;Spring Cloud Contr…

java序列化的方法_【Java常见序列化与反序列方法总结】

人和电脑在很多方面都是十分相似的&#xff0c;大脑可以看成电脑主机&#xff0c;五官/身体等表面器官就是显示器、鼠标等外设。这篇文章就是想把计算机跟人做类比YY一下序列化和反序列化的机制、用途。如果你是初学者&#xff0c;心里肯定会问究竟什么是序列化/反序列化&#…

python的编码模块char_关于sqlmap当中tamper脚本编码绕过原理的一些总结(学习python没多久有些地方肯定理解有些小问题)...

sqlmap中tamper脚本分析编写置十对一些编码实现的脚本&#xff0c;很多sqlmap里面需要引用的无法实现&#xff0c;所以有一部分例如keywords就只写写了几个引用了一下&#xff0c;其实这里很多脚本运用是可以绕过安全狗的。本人也是刚开始学习python没多久&#xff0c;有一些错…

java的多态怎么理解_JAVA多态的理解

面向对象的三大特性&#xff1a;封装、继承、多态&#xff0c;其中最难理解的就是多态以下是网上某大神给的一个例子&#xff1a;1.继承关系class A {public String show(D obj){return ("A and D");}public String show(A obj){return ("A and A");}}clas…

java class isassignablefrom_Java之——Class的isAssignableFrom方法

转载请注明出处 https://blog.csdn.net/l1028386804/article/details/80508540Class的isAssignableFrom方法定义如下public native boolean isAssignableFrom(Class ? cls);由方法签名可见是一个本地方法 即C代码编写的。以下是JDK中的注释Determines if the class or interfa…

java中堆栈的基本操作_玩儿转队列和栈的基本操作及其应用:Java 版

队列的基本操作队列入队出队实现队列是种先进先出的数据结构。队列的基本操作主要是入队和出队。数据从队尾进入队列&#xff0c;从队首出队列。下面来写一个简单的队列:public class MyQueue {private List data;private int pointer;public MyQueue() {data new ArrayList&l…

java规定日期格式输出_Java格式化输出日期百分比时间等

Java格式化输出Java的格式化输出等同于String.Format&#xff0c;与C有很大的相似&#xff0c;比如System.out.printf(“%8.2f”, x);在printf中&#xff0c;可以使用多个参数&#xff0c;例如&#xff1a;System.out.printf(“Hello, %s. Next year, you’ll be %d”, name, a…

java界面编辑教程_java程序设计基础教程第六章图形用户界面编辑.docx

java程序设计基础教程第六章图形用户界面编辑.docx还剩27页未读&#xff0c;继续阅读下载文档到电脑&#xff0c;马上远离加班熬夜&#xff01;亲&#xff0c;很抱歉&#xff0c;此页已超出免费预览范围啦&#xff01;如果喜欢就下载吧&#xff0c;价低环保&#xff01;内容要点…

c盘java文件误删_java获取C盘下的隐藏目录文件名称

题记—— 执剑天涯&#xff0c;从你的点滴积累开始&#xff0c;所及之处&#xff0c;必精益求精&#xff0c;即是折腾每一天。网易云课堂在Java中&#xff0c; File类用来将文件或者文件夹封装成对象&#xff0c;方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传…

对java这门课程的认识_关于java课程的总结

前言本次博客主要内容为此次三次作业的总结&#xff0c;整门java课程学习的总结&#xff0c;以及在此次java课程中的收获&#xff0c;和对课程的意见。作业过程总结第一次作业主要考察的是对程序的可扩展性&#xff0c;实现开闭原则非常重要&#xff0c;因为程序随着时间&#…

linux php和java环境变量配置_Linux下配置Java环境变量

一般来说&#xff0c;我们都会把Java安装到 /usr/local 目录 或者 /opt 目录下。这里假设java安装包已解压在了 /opt下&#xff0c;具体目录为&#xff1a;/opt/java8/java1.8.0_45目录(注意&#xff1a;如果是生产环境中&#xff0c;一定要root用户来安装配置)。下面我们来配置…

java多线程多态_Java学习之多线程

多线程&#xff1a;(一)进程与线程进程特点并发与并行的区别&#xff1a;多线程编程的好处&#xff1a;(二)多线程的建立1&#xff0c;通过继承Thread类&#xff0c;代码如下&#xff1a;class MyThread extendsThread {private static int K 10;//类共享变量private int M10;…

java 执行存储过程报语法错误_为什么我在批处理从Java上执行PostgreSQL上的存储过程时收到错误通知“结果不合理”?...

我在数据库中有这个过程&#xff1a;CREATE OR REPLACE FUNCTION replacePageRelevance(id INT, value REAL) RETURNS VOID AS $$BEGININSERT INTO pageRelevance VALUES (id,value);EXCEPTION WHEN unique_violation THENUPDATE pageRelevance SET relevance value WHERE pag…

python staticmethod有什么意义_关于静态方法:python中的@staticmethod有什么意义?

为了更好地理解静态方法在Python中的工作方式&#xff0c;我开发了这个简短的测试/示例代码。class TestClass:def __init__(self, size):self.size sizedef instance(self):print("regular instance method - with self")staticmethoddef static():print("sta…

java fx border_JavaFx UI控件与代码间的绑定方法

JavaFx初探一&#xff0c;UI控件的使用&#xff0c;具体内容如下方式一&#xff1a;使用纯代码直接new view控件&#xff0c;这样就不涉及到与fxml文件之间的交互了方式二&#xff1a;使用fxml编写界面文件&#xff0c;用可视化工具scene builder 来构建交互界面。分两种方式绑…

java mysql ssl警告_连接到MySQL数据库时有关SSL连接的警告

用于初始化与MySQL服务器的连接的默认值在最近已更改&#xff0c;并且(通过快速查看堆栈溢出时最流行的问题和答案)新值引起了很多混乱。更糟糕的是&#xff0c;标准建议似乎是完全禁用SSL&#xff0c;这在制造过程中有点麻烦。现在&#xff0c;如果您的连接确实没有暴露给网络…

如何将php改成mp4,PHP 将视频转成 MP4 并获取视频预览图(用到ffmpeg)

搜索热词下面是编程之家 jb51.cc 通过网络收集整理的代码片段。编程之家小编现在分享给大家&#xff0c;也给大家做个参考。flv_convert_get_thumb(input.avi,output.jpg,output.ogm);// code provided and updated by steve of PHPsnaps ! thanks// accepts:// 1: the input v…

php无嵌套遍历多维数组,不递归怎么遍历多维数组(维数不定)

不递归如何遍历多维数组(维数不定)现有数组$tree array (array (ID > 1,PARENT > 0,NAME > 祖父,CHILD > array (array (ID > 3,PARENT > 1,NAME > 叔伯),array (ID > 4,PARENT > 1,NAME > 父亲,CHILD > array (array (ID > 5,PARENT >…

c 如何操作php,thinkphp的c方法使用示例

1.C方法的作用a. 加载设置用户的配置&#xff0c;保存在一个C函数内的静态变量$_config 中b. 读取用户的配置 (从$_congig 中读取)2. 需求分析:1.设置变量1.二维数组C(array(DB_PASSWORD>root,DB_USERNAME>root),DB);C(DB.USER_NAME,XIAOCHEN);2.一维数组C(USER_NAME,小陈…

php seaslog安装,浅谈win10下安装php seaslog扩展的方法

本篇文章给大家分享一下win10 php安装seaslog扩展的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。【推荐学习&#xff1a;《PHP视频教程》】一、检查系统环境情况使用phpinfo()检查系统环境情况&#xff0c;找到需要下载的配置…