博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThreadUtil 多线程处理List,回调处理具体的任务
阅读量:4459 次
发布时间:2019-06-08

本文共 3478 字,大约阅读时间需要 11 分钟。

每次想多线程处理一个大的结果集的时候 都需要写一大堆代码,自己写了个工具类 方便使用

package com.guige.fss.common.util;import com.guige.fss.common.exception.BusinessException;import io.swagger.models.auth.In;import lombok.extern.slf4j.Slf4j;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.CollectionUtils;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;/** * Created by admin on 2018/6/5. * @author 宋安伟 */public class ThreadUtil {    //创建定长线程池,初始化线程    private static Logger log = LoggerFactory.getLogger(ThreadUtil.class);    /**     * 对List进行多线程处理(限制 对List只读 如果想修改List 可以处理完毕后把要修改或删除的List返回 多线程执行完后再修改或删除)     * @param list 要处理的List     * @param threadSize 用几个线程处理     * @param threadLoadback 处理的回调(具体业务员)     * @param 
每个回调的返回结果 * @param
List
的泛型 * @return */ public static
List
executorsTasks(final List
list,final int threadSize,final ThreadLoadback
threadLoadback){ // 开始时间 long start = System.currentTimeMillis(); // 总数据条数 int dataSize = list.size(); // 线程数 int threadNum = dataSize / threadSize + 1; // 定义标记,过滤threadNum为整数 boolean special = dataSize % threadSize == 0; // 创建一个线程池 ExecutorService exec = Executors.newFixedThreadPool(threadNum); // 定义一个任务集合 List
> tasks = new ArrayList
>(); Callable
task = null; List cutList = null; for (int i = 0; i < threadNum; i++) { if (i == threadNum - 1) { if (special) { break; } cutList = list.subList(threadSize * i, dataSize); } else { cutList = list.subList(threadSize * i, threadSize * (i + 1)); } // System.out.println("第" + (i + 1) + "组:" + cutList.toString()); final List listStr = cutList; task = new Callable
() { @Override public T call() throws Exception { // System.out.println(Thread.currentThread().getName() + "线程:" + listStr); return (T) threadLoadback.load(listStr); // return } }; // 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系 tasks.add(task); } List
> resultsFuture = null; try { log.debug("线程任务执行开始:任务数"+tasks.size()); resultsFuture = exec.invokeAll(tasks); List
results = new ArrayList<>(); for (Future
future : resultsFuture) { T result=future.get(); if(result!=null) { results.add(result); } } return results; } catch (Exception e) { e.printStackTrace(); throw new BusinessException(e.getMessage()); }finally { // 关闭线程池 exec.shutdown(); log.debug("线程任务执行结束"); log.debug("执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒"); } } interface ThreadLoadback
{ T load(List
list) throws Exception; } public static void main(String[] args) { List
list = new ArrayList<>(); for(int i=0;i<1000;i++){ list.add("i="+i); } List
> resultList= ThreadUtil.executorsTasks(list, 10, new ThreadLoadback
, String>() { @Override public List
load(List
list) throws Exception { List
result= new ArrayList<>(); for(String str:list){ str= str.replaceAll("i=",""); result.add(Integer.parseInt(str)); System.out.println(Thread.currentThread().getName()+"休息1秒"); Thread.sleep(1000L); } return result; } }); if(!CollectionUtils.isEmpty(resultList)){ List
integers = new ArrayList<>(); resultList.stream().forEach(items -> { if (!CollectionUtils.isEmpty(resultList)) { items.stream().forEach(item -> { integers.add(item); }); } } ); integers.stream().forEach(item->System.out.println(item)); } }}

 

转载于:https://www.cnblogs.com/songanwei/p/10131936.html

你可能感兴趣的文章
我在富士康挨踢了七年(十六. 跳楼年,终于认识了我自己)
查看>>
.net注册iis
查看>>
vs2017更新后web项目部分后台代码类没有颜色,也没有自动提示输入功能
查看>>
关于Orcale 11g 安装过程
查看>>
DevExpress WinForms使用教程:Ribbon性能
查看>>
Cacti完全使用手册 ( 让你快速个性化使用Cacti )
查看>>
Jmeter使用_StringFromFile函数需要添加编码方式
查看>>
20180418开发日志
查看>>
PCB SVN 服务端VisualSVN Server与TortoiseSVN
查看>>
mybatis动态SQL中的set标签的使用
查看>>
MySQL 5.6 & 5.7最优配置模板
查看>>
Java虚拟机各内存区域的位置及功能的介绍
查看>>
Android 中判断网络状态
查看>>
netty3升netty4一失眼成千古恨
查看>>
HTML设置表格
查看>>
C# winfrom提示框,点击则不显示,不点击则提示输入内容
查看>>
修改、更新、删除mysql
查看>>
Nginx初识
查看>>
201771010113 李婷华 《面向对象程序设计(java)》第七周学习总结
查看>>
A+B
查看>>