基于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开发中,多线程分段下载是一项重要的技术,特别是在处理大文件或者网络环境不稳定的情况下,能够提高下载效率并优化用户体验。这个"Android多线程分段下载源码"实例是一个很好的学习资源,它实现了文件的...
在IT领域,多线程遍历磁盘文件是一项常见的任务,尤其在大数据处理、文件管理系统以及备份恢复等场景中。本文将深入探讨如何利用多线程技术高效地遍历包括隐藏文件和系统文件在内的所有磁盘文件。 首先,我们要理解...
同时,Spring框架提供的线程池功能则可以帮助我们优化多线程环境下的性能,特别是处理并发请求时。在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 ...
使用QT5实现了多线程...刚开始学习QT,网上没有找到多线程分段下载的源码,有一个博主展示了这个功能,要加入付费群才能给源码,估计给源码又得付费。自己通过查资料实现的,还有很多不完善的地方,欢迎大家提建议。
在Spring框架中,线程池的使用是实现并发和异步任务执行的关键工具。线程池的概念源于Java的`java.util.concurrent.ExecutorService`接口,它允许我们管理一组可重用的工作线程,以提高系统效率并减少资源消耗。...
线程池在多线程编程中扮演着至关重要的角色,它能有效地管理和调度并发任务,从而提高系统资源的利用率,避免频繁创建和销毁线程带来的开销。 线程池的工作原理: 1. **线程复用**:线程池中的线程被创建后不会立即...
线程池是多线程编程中的一个重要概念,它能够有效地管理并发任务的执行,提高系统的性能和效率。本实例将深入探讨Spring中的线程池实现,包括其工作原理、配置方式以及如何在实际应用中使用。 首先,我们要理解...
在IT行业中,多线程是程序设计中的一个重要概念,特别是在处理并发操作时,如网络服务、数据处理和用户界面更新等。多线程允许程序同时执行...通过源码学习,我们可以深化对多线程和线程池的理解,提升我们的编程能力。
主要 是通过学习线程池与互斥锁条件变量来线程之间的通信,输入目标目录或者是文件,用DIR函数,判断是目录还是普通文件,大文件还是小文件,大文件用LSEEK分段保存在链表中 ,分段复制。该小项目主要包含,线程池与...
ActiveMQ与Spring线程池整合的一个实例。 lib库没有上传。 对于实例的讲解,在竹子的论坛有我对这个实例的帖子(http://www.java2000.net/viewthread.jsp?tid=1167) lib中包含: apache-activemq-4.1.1.jar ...
在大型文件下载时,为了提高效率和用户体验,通常会采用多线程分段下载的方式。本篇文章将深入探讨如何使用HTTPClient进行多线程分段下载的实践。 首先,我们要理解多线程下载的基本原理。多线程下载是通过将大文件...
golang遍历全盘目录,采用线程池方式,资源利用最大化,采用多协程线程池重复利用方式对目录进行扫描,可以对线程的资源充分利用。
线程池是预先创建并维护的一组可重用线程集合。当有新任务到来时,线程池会从已存在的线程中选择一个来执行任务,而不是每次都创建新的线程。这样可以避免频繁地创建和销毁线程带来的开销,同时也能确保系统在面临...
在本项目中,“qt5多线程pingIP地址(线程池)”是一个利用Qt5框架和多线程技术来实现对多个IP地址进行并发ping操作的应用。这个应用可能会被网络管理员或者开发人员用来快速检测网络连通性,特别是在大规模网络环境...
线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...
本篇将深入探讨如何利用SpringBoot实现多线程下载文件以及分段下载文件的技术。 首先,多线程下载文件是一种提高下载速度的方法,通过将大文件分成多个小部分,每个部分由一个单独的线程负责下载,从而充分利用多核...
Java多线程编程,生命游戏,用线程池.zipJava多线程编程,生命游戏,用线程池.zip Java多线程编程,生命游戏,用线程池.zipJava多线程编程,生命游戏,用线程池.zip Java多线程编程,生命游戏,用线程池.zipJava多...
普通 多线程计算矩阵乘法和利用线程池运算
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。使用线程池可以有效地控制运行的线程数量,避免过多线程导致系统资源过度消耗,同时也能简化线程的管理和回收。Java的...