基于Spring 的ThreadPoolTaskExecutor 线程池分段遍历读取集合list
代码如下所示:
1、定义线程池
<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!--初始线程池大小--> <property name="corePoolSize" value="10"/> <!--最大线程池大小--> <property name="maxPoolSize" value="30"/> </bean>
2、主线程代码
@Autowired public ThreadPoolTaskExecutor threadPoolTaskExecutor; private void doReadList() throws InterruptedException, ExecutionException{ /**初始化集合**/ List<String> list = new ArrayList<String>(); for(int i=0;i<100;i++){ list.add("test--"+i); } /**接收集合各段的 执行的返回结果**/ List<Future<Boolean>> futureList = new ArrayList<Future<Boolean>>(); /**集合总条数**/ int size = list.size(); /**将集合切分的段数**/ int sunSum = 10; int listStart,listEnd; /***当总条数不足10条时 用总条数 当做线程切分值**/ if(sunSum > size){ sunSum = size; } /**定义子线程**/ SunCallable sunCallable ; /**将list 切分10份 多线程执行**/ for (int i = 0; i < sunSum; i++) { /***计算切割 开始和结束**/ listStart = size / sunSum * i ; listEnd = size / sunSum * ( i + 1 ); /**最后一段线程会 出现与其他线程不等的情况**/ if(i == sunSum - 1){ listEnd = size; } /**线程切断**/ List<String> sunList = list.subList(listStart,listEnd); /**子线程初始化**/ sunCallable = new SunCallable(i,sunList); /***多线程执行***/ futureList.add(taskExecutor.submit(sunCallable)); } /**对各个线程段结果进行解析**/ for(Future<Boolean> future : futureList){ if(null != future && future.get()){ System.err.println("成功"); }else{ System.err.println("失败"); } } }
3、子线程SunCallable代码:
package xxx.xxx.xxx.xx; import java.util.List; import java.util.concurrent.Callable; public class SunCallable implements Callable<Boolean> { /**当前是属于第几段线程**/ private int pageIndex; private List<String> list; public SunCallable(int pageIndex,List<String> list){ this.pageIndex = pageIndex; this.list = list; } @Override public Boolean call() throws Exception { System.err.println(String.format("pageIndex:%s size:%s",pageIndex,list.size())); Boolean result = Boolean.TRUE; if(null != list && list.size() >0){ for(String str: list){ try { //TODO 业务处理 } catch (Exception e) { result = Boolean.FALSE;; } } } return result; } }
相关推荐
快速多线程磁盘遍历。优化遍历算法,快速遍历,包括隐藏文件和系统文件在内的全部文件
Android 进行文件分段多线程下载的实例,用户可以指定线程数,还可以通过进度条查看下载的进度。
java多线程,对多线程,线程池进行封装,方便使用
springmvc+spring线程池处理http并发请求数据同步控制问题
使用QT5实现了多线程...刚开始学习QT,网上没有找到多线程分段下载的源码,有一个博主展示了这个功能,要加入付费群才能给源码,估计给源码又得付费。自己通过查资料实现的,还有很多不完善的地方,欢迎大家提建议。
主要 是通过学习线程池与互斥锁条件变量来线程之间的通信,输入目标目录或者是文件,用DIR函数,判断是目录还是普通文件,大文件还是小文件,大文件用LSEEK分段保存在链表中 ,分段复制。该小项目主要包含,线程池与...
1. SyncTaskExecutor:同步可以用SyncTaskExecutor,但这个可以说不算一个线程池,因为还在原线程执行。这个类没有实现异步调用,只是一个同步操作。 2.也可以用ThreadPoolTaskExecutor结合FutureTask做到同步。 3.2...
ActiveMQ与Spring线程池整合的一个实例。 lib库没有上传。 对于实例的讲解,在竹子的论坛有我对这个实例的帖子(http://www.java2000.net/viewthread.jsp?tid=1167) lib中包含: apache-activemq-4.1.1.jar ...
golang遍历全盘目录,采用线程池方式,资源利用最大化,采用多协程线程池重复利用方式对目录进行扫描,可以对线程的资源充分利用。
源码演示了多线程写法,主要是对比精易模块线程池,鱼刺模块线程池。@在人间。
纯JavaFX实现的多线程分段下载工具,不依赖任何第三方库,实现多线程分段下载以及下载完成后的资源合并,全图形化界面操作,充分利用多核CPU。
使用线程池管理多线程上传,包含了文件拆分,文件分片多线程上传,单文件上传。多线程执行任务等待管理。拒绝直接new Thread创建新线程导致的诸多问题
c++ 多线程线程池 demo
vs2012写的,c# winform程序. 运用线程池写的,查找文件winform, 多线程查找文件. 可以查看当前硬盘有哪些文件,每个文件对应的文件大小.文件路径. 运用listView显示结果.listView分开显示结果信息
Java多线程编程,生命游戏,用线程池.zipJava多线程编程,生命游戏,用线程池.zip Java多线程编程,生命游戏,用线程池.zipJava多线程编程,生命游戏,用线程池.zip Java多线程编程,生命游戏,用线程池.zipJava多...
普通 多线程计算矩阵乘法和利用线程池运算
java多线程并发查询数据库,使用线程池控制分页,并发查询。
1.创建多线程程序 2.使用RandomAccessFile类分段读写大文件 3.通过多线程分段读取大文件并分段写入到新文件
JAVA使用线程池查询大批量数据