多线程分段遍历集合list(spring 线程池)
2018-06-18 03:32:42来源:未知 阅读 ()
基于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; } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:多文件上传
- 最详细的java多线程教程来了 2020-06-08
- 系统化学习多线程(一) 2020-06-08
- 多线程:生产者消费者(管程法、信号灯法) 2020-06-01
- 遍历Map的方式 2020-05-31
- 如何合理地估算线程池大小? 2020-05-31
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash