栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程处理一个大的LIST集合

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程处理一个大的LIST集合

业务背景:

有一批5~10W的Excel文件,使用Poi直接拿到了一个大的List集合,在进行业务遍历时,发现速度堪忧,5W数据大概要跑1个小时。决定使用多线程对其进行优化

第一步.声明一个线程池对象

此处直接定义一个线程池交由spring进行管理

@EnableAsync @Component public class AsyncThreadPool { 
    @Bean("ThreadPoolTaskExecutor") 
    public ThreadPoolTaskExecutor initializeThreadPool() { 
        ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor (); 
         
        threadPool.setCorePoolSize(5); 
        
        threadPool.setMaxPoolSize(10); 
             
        threadPool.setQueueCapacity(1000); 
             
        threadPool.setKeepAliveSeconds(30); 
             
        threadPool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); 
         
        threadPool.initialize(); 
        return threadPool; 
    } 
}

第二步,新建类,里面写具体业务逻辑代码,开启异步且指定线程池对象

@Slf4j 
@Async("ThreadPoolTaskExecutor") 
@Component public class AsyncThreadUpdate { 
    public Future 方法名(参数~可有可不有){ 
        这里写具体业务逻辑 
    return new AsyncResult(true); 
    } 
}

第三步,在业务层分批处理数据并调用此异步方法

List> futures = new ArrayList>(strList.size()/ThreadPool_NUM);

List sonList = strList.subList(i, i + toIndex); 
 
Future future = asyncThreadUpdate.getThreadFuture(参数~可以不加); futures.add(future) 
for (Future future : futures) { 
 
future.get(); 
} 

备注:

上面方法执行完毕后发现并不理想,是因为没有调用线程等待,即:等待所有的task任务结束后才继续往下执行

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998604.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号